package com.airlock.iam.oauth2.domain.model.resource;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.api.domain.model.claims.conditions.ClaimCondition;
import com.airlock.iam.oauth2.application.configuration.resource.OAuth2StaticResourceProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;
import java.util.Set;

@LogicForConfig(OAuth2StaticResourceProviderConfig.class)
public final class OAuth2StaticResourceProvider implements OAuth2ResourceProvider {
   private final Provider<OAuth2ResourceIdentifier> identifier;
   private final Provider<String> value;
   private final Provider<Optional<ClaimCondition>> condition;

   @Inject
   public OAuth2StaticResourceProvider(Provider<OAuth2ResourceIdentifier> identifier, Provider<String> value, Provider<Optional<ClaimCondition>> condition) {
      this.identifier = identifier;
      this.value = value;
      this.condition = condition;
   }

   @Override
   public Optional<OAuth2ResourceResult> getResourceResult(PersistentUser user, Set<OAuth2Scope> givenScopes, OAuth2ClientId clientId) {
      return ((Optional)this.condition.get()).isPresent() && !((ClaimCondition)((Optional)this.condition.get()).get()).isSatisfied(givenScopes)
         ? Optional.empty()
         : Optional.of(OAuth2ResourceResult.resourceResult().add((OAuth2ResourceIdentifier)this.identifier.get(), this.value.get()));
   }
}
