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.domain.model.session.FlowFederationSession;
import com.airlock.iam.saml2.domain.service.sp.logout.Saml2LogoutActionOnSpService;
import com.airlock.iam.saml2.infrastructure.service.sp.logout.Saml2LogoutActionOnSpServiceImpl;
import com.airlock.iam.saml2.infrastructure.sp.logout.Saml2SpInitiatedSloFederationSessionCache;
import com.airlock.iam.saml2.infrastructure.sp.logout.Saml2SpInitiatedSloFederationSessionCacheImpl;
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 Saml2LogoutOnSpActionModule extends PrivateModule {
   @Provides
   Saml2DataMap<FlowFederationSession> provideFlowFederationSessionDataMap(Provider<StateRepository> stateStore) {
      return new StateStoreBackedSaml2DataMap<>(stateStore, "Saml2SpInitiatedSloId", new FlowFederationSessionSerializer());
   }

   protected void configure() {
      this.bind(Saml2SpInitiatedSloFederationSessionCache.class).to(Saml2SpInitiatedSloFederationSessionCacheImpl.class);
      this.bind(Saml2LogoutActionOnSpService.class).to(Saml2LogoutActionOnSpServiceImpl.class);
      this.expose(Saml2LogoutActionOnSpService.class);
   }
}
