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

import com.airlock.iam.common.domain.service.state.StateRepository;
import com.airlock.iam.openfedlib.saml2.state.Saml2DataMap;
import com.airlock.iam.saml2.application.configuration.Saml2FlowIdpConfig;
import com.airlock.iam.saml2.domain.model.logout.Saml2ClearGatewaySessionOnSloSetting;
import com.airlock.iam.saml2.domain.model.session.FlowFederationSession;
import com.airlock.iam.saml2.domain.service.idp.logout.Saml2LogoutActionOnIdpService;
import com.airlock.iam.saml2.infrastructure.idp.logout.Saml2IdpInitiatedSloFederationSessionCache;
import com.airlock.iam.saml2.infrastructure.idp.logout.Saml2IdpInitiatedSloFederationSessionCacheImpl;
import com.airlock.iam.saml2.infrastructure.service.idp.logout.Saml2LogoutActionOnIdpServiceImpl;
import com.airlock.iam.saml2.infrastructure.state.FlowFederationSessionSerializer;
import com.airlock.iam.saml2.infrastructure.state.StateStoreBackedSaml2DataMap;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.inject.Provider;

public final class Saml2LogoutOnIdpActionModule extends PrivateModule {
   @Provides
   Saml2DataMap<FlowFederationSession> provideFlowFederationSessionDataMap(Provider<StateRepository> stateStore) {
      return new StateStoreBackedSaml2DataMap<>(stateStore, "Saml2IdpInitiatedSloId", new FlowFederationSessionSerializer());
   }

   @Provides
   Saml2ClearGatewaySessionOnSloSetting provideClearGatewaySessionOnSlo(Saml2FlowIdpConfig config) {
      return new Saml2ClearGatewaySessionOnSloSetting(config.isClearGatewaySessionOnSlo());
   }

   protected void configure() {
      this.bind(Saml2IdpInitiatedSloFederationSessionCache.class).to(Saml2IdpInitiatedSloFederationSessionCacheImpl.class);
      this.bind(Saml2LogoutActionOnIdpService.class).to(Saml2LogoutActionOnIdpServiceImpl.class);
      this.expose(Saml2LogoutActionOnIdpService.class);
   }
}
