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

import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.common.domain.service.state.StateRepository;
import com.airlock.iam.openfedlib.saml2.state.Saml2DataMap;
import com.airlock.iam.saml2.application.configuration.SamlConfig;
import com.airlock.iam.saml2.infrastructure.Saml2CommonSpaUrls;
import com.airlock.iam.saml2.infrastructure.service.sp.logout.Saml2IdpInitiatedSloServiceImpl;
import com.airlock.iam.saml2.infrastructure.sp.logout.Saml2IdpInitiatedSloCache;
import com.airlock.iam.saml2.infrastructure.sp.logout.Saml2IdpInitiatedSloCacheImpl;
import com.airlock.iam.saml2.infrastructure.state.Saml2IdpInitiatedSloCacheEntrySerializer;
import com.airlock.iam.saml2.infrastructure.state.StateStoreBackedSaml2DataMap;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.inject.Provider;
import java.net.URI;
import java.util.Optional;

public final class Saml2IdpInitiatedSloServiceModule extends PrivateModule {
   @Provides
   URI provideUiLogoutUri(Optional<SamlConfig> samlConfig) {
      return ServiceConfigurationException.checkPresent(samlConfig, "No SAML2 configuration")
         .getCustomSpLogoutUri()
         .orElse(Saml2CommonSpaUrls.UI_LOGOUT_URI.uri());
   }

   @Provides
   Saml2DataMap<Saml2IdpInitiatedSloCache.Saml2IdpInitiatedSloCacheEntry> provideSaml2SpInitiatedSloCacheEntryDataMap(Provider<StateRepository> stateRepository) {
      return new StateStoreBackedSaml2DataMap<>(stateRepository, "Saml2IdpInitiatedSloCache", new Saml2IdpInitiatedSloCacheEntrySerializer());
   }

   protected void configure() {
      this.bind(Saml2IdpInitiatedSloCache.class).to(Saml2IdpInitiatedSloCacheImpl.class);
      this.bind(Saml2IdpInitiatedSloServiceImpl.class);
      this.expose(Saml2IdpInitiatedSloServiceImpl.class);
   }
}
