package com.airlock.iam.oauth2.infrastructure.factory;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.application.configuration.OpenIDConnectSsoFlowClientSettingsBase;
import com.airlock.iam.oauth2.domain.model.client.communication.OpenIDConnectClientParserSettings;
import com.airlock.iam.oauth2.domain.service.client.OAuth2RedirectUriService;
import java.net.URI;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public final class OpenIDConnectClientParserSettingsFactory {
   private OpenIDConnectClientParserSettingsFactory() {
   }

   public static OpenIDConnectClientParserSettings initParserSettings(
      OpenIDConnectSsoFlowClientSettingsBase settings, OAuth2RedirectUriService redirectUriService
   ) {
      return OpenIDConnectClientParserSettings.builder()
         .clientId(OAuth2ClientId.oAuth2ClientId(settings.getClientId()))
         .redirectUri(redirectUriService.redirectUri().orElseThrow(() -> new FailureException("invalid redirection URI")))
         .authorizationEndpointUri(() -> URI.create(settings.getAuthorizationEndpointURL()))
         .customIssuerClaim(Optional.ofNullable(settings.getCustomIssuerClaim()).filter(StringUtils::isNotBlank))
         .customAudienceClaim(Optional.ofNullable(settings.getCustomAudienceClaim()).filter(StringUtils::isNotBlank))
         .audienceClaimValidationMethod(settings.getAudienceClaimValidationMethod())
         .acrValuesClaim(settings.getAcrValuesClaim())
         .claimRequestSettings(ClaimRequestSettingsFactory.mapClaimRequestSettings(settings.getClaimsToRequest()))
         .enableAcrValidation(settings.isEnableAcrValidation())
         .includeNonce(settings.isIncludeNonce())
         .build();
   }
}
