package com.airlock.iam.authentication.infrastructure.factory.saml2;

import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.saml2.application.configuration.Saml2FlowIdpConfig;
import com.airlock.iam.saml2.domain.model.idp.Saml2AuthenticationContextClassRef;
import com.airlock.iam.saml2.domain.model.idp.Saml2ConditionalAuthenticationContextClassRef;
import com.airlock.iam.saml2.domain.model.idp.Saml2ConditionalAuthenticationContextClassRefList;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.Optional;

public final class Saml2AuthenticationContextClassRefModule extends PrivateModule {
   @Provides
   @Exposed
   @RequestScoped
   Optional<Saml2AuthenticationContextClassRef> provideAuthenticationContextClassRef(Saml2FlowIdpConfig config, PluginConfigToLogic toLogic) {
      return Saml2ConditionalAuthenticationContextClassRefList.builder()
         .conditionalAuthenticationContexts(
            config.getAuthnContextMappings()
               .stream()
               .map(
                  mapping -> Saml2ConditionalAuthenticationContextClassRef.conditionalAuthenticationContext(
                     toLogic.getLogic(mapping.getFlowCondition()), Saml2AuthenticationContextClassRef.authenticationContext(mapping.getAuthnContextUri())
                  )
               )
               .toList()
         )
         .defaultAuthenticationContext(config.getDefaultAuthnContextUri().map(Saml2AuthenticationContextClassRef::authenticationContext))
         .build()
         .provide();
   }

   protected void configure() {
   }
}
