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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.application.configuration.OpenIdConnectDefaultAcrClaimConfig;
import com.airlock.iam.oauth2.domain.model.acr.AcrToApplicationId;
import com.airlock.iam.oauth2.domain.model.acr.OpenIdConnectAcrValue;
import com.airlock.iam.oauth2.domain.model.settings.OAuth2ApplicationFlowSelectionSettings;
import jakarta.inject.Inject;
import java.util.List;
import java.util.Optional;

@LogicForConfig(OpenIdConnectDefaultAcrClaimConfig.class)
public class OpenIdConnectDefaultAcrClaimSelection implements OpenIdConnectIdTokenAcrSelection {
   private static final ELogger LOG = ELoggerFactory.getLogger(OpenIdConnectDefaultAcrClaimSelection.class);
   private final OAuth2ApplicationFlowSelectionSettings settings;

   @Inject
   public OpenIdConnectDefaultAcrClaimSelection(OAuth2ApplicationFlowSelectionSettings settings) {
      this.settings = settings;
   }

   @Override
   public Optional<OpenIdConnectAcrValue> select(List<OpenIdConnectAcrValue> requestedAcrValues, OAuth2ClientId clientId) {
      Optional<OpenIdConnectAcrValue> acrValue = this.settings.mapRequestedAcrToAppId(requestedAcrValues, clientId).map(AcrToApplicationId::getAcr);
      if (acrValue.isPresent()) {
         LOG.debug(String.format("Add ACR claim value %s into ID Token", LogUtil.quote(acrValue.get())));
      }

      return acrValue;
   }
}
