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

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.common.api.domain.model.user.transformation.UsernameTransformation;
import com.airlock.iam.common.application.configuration.certificate.ClientCertificateRequestAuthenticationConfig;
import com.airlock.iam.common.domain.model.certificate.CertificateValidityChecker;
import com.airlock.iam.common.domain.model.certificate.CertificateValidityCheckerImpl;
import com.airlock.iam.common.domain.model.certificate.ClientCertificateAuthenticationSettings;
import com.airlock.iam.common.domain.model.certificate.UserAttributeExtractor;
import com.airlock.iam.common.domain.model.certificate.UserAttributeExtractorImpl;
import com.airlock.iam.common.domain.model.gateway.WafSettings;
import com.airlock.iam.common.domain.model.transform.UsernameTransformerUsernameTransformation;
import com.airlock.iam.security.certificate.CertificateStatusChecker;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.List;
import java.util.Optional;

@ModuleForConfig(ClientCertificateRequestAuthenticationConfig.class)
public final class ClientCertificateRequestAuthenticationModule extends PrivateModule {
   @Provides
   @Exposed
   UsernameTransformation provideUsernameTransformation(ClientCertificateRequestAuthenticationConfig config) {
      return new UsernameTransformerUsernameTransformation(config.getUsernameTransformers());
   }

   @Provides
   @Exposed
   ClientCertificateAuthenticationSettings provideSettings(ClientCertificateRequestAuthenticationConfig config, Optional<WafSettings> wafSettings) {
      return new ClientCertificateAuthenticationSettings(
         config.isCheckValidityPeriod(), config.getUserAttribute(), wafSettings.map(WafSettings::getEnvironmentCookiePrefix)
      );
   }

   @Provides
   List<CertificateStatusChecker> provideCertificateStatusCheckers(ClientCertificateRequestAuthenticationConfig config) {
      return config.getCertStatusCheckers();
   }

   protected void configure() {
      this.bind(CertificateValidityChecker.class).to(CertificateValidityCheckerImpl.class);
      this.expose(CertificateValidityChecker.class);
      this.bind(UserAttributeExtractor.class).to(UserAttributeExtractorImpl.class);
      this.expose(UserAttributeExtractor.class);
   }
}
