package com.airlock.iam.oauth2.domain.service;

import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2ClientAuthentication;
import com.airlock.iam.oauth2.domain.model.client.OAuth2Client;
import com.airlock.iam.oauth2.domain.model.token.scope.OAuth2GrantedScopeProcessor;
import com.airlock.iam.oauth2.domain.service.scopepolicy.ScopePolicy;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;
import java.util.Set;

public final class GrantedScopeProcessorsServiceImpl implements GrantedScopeProcessorsService {
   private static final ELogger LOG = ELoggerFactory.getLogger(GrantedScopeProcessorsServiceImpl.class);
   private final Provider<List<OAuth2GrantedScopeProcessor>> grantedScopeProcessors;

   @Inject
   public GrantedScopeProcessorsServiceImpl(Provider<List<OAuth2GrantedScopeProcessor>> grantedScopeProcessors) {
      this.grantedScopeProcessors = grantedScopeProcessors;
   }

   @Override
   public Set<OAuth2Scope> processScopes(Set<OAuth2Scope> scopes, OAuth2Client client, OAuth2ClientAuthentication authentication) {
      Set<OAuth2Scope> processed = Set.copyOf(scopes);

      for (OAuth2GrantedScopeProcessor accessTokenScopeProcessor : (List)this.grantedScopeProcessors.get()) {
         processed = accessTokenScopeProcessor.process(processed, client, authentication);
      }

      if (!processed.equals(scopes)) {
         LOG.debug("Scopes filtered by scope processor resulting in %s".formatted(ScopePolicy.toScopeString(processed)));
      }

      return processed;
   }
}
