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.application.configuration.claims.OAuth2UsernameTransformer;
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.OAuth2UsernameResourceProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;
import java.util.Set;

@LogicForConfig(OAuth2UsernameResourceProviderConfig.class)
public final class OAuth2UsernameResourceProvider implements OAuth2ResourceProvider {
   private final Provider<OAuth2ResourceIdentifier> identifier;
   private final Provider<OAuth2UsernameTransformer> usernameProvider;
   private final Provider<Optional<ClaimCondition>> condition;

   @Inject
   public OAuth2UsernameResourceProvider(
      Provider<OAuth2ResourceIdentifier> identifier, Provider<OAuth2UsernameTransformer> usernameTransformer, Provider<Optional<ClaimCondition>> condition
   ) {
      this.identifier = identifier;
      this.usernameProvider = usernameTransformer;
      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(), ((OAuth2UsernameTransformer)this.usernameProvider.get()).apply(user))
         );
   }
}
