package com.airlock.iam.admin.infrastructure.factory.prot;

import com.airlock.iam.admin.application.configuration.certificate.CertificateTokenController;
import com.airlock.iam.admin.application.service.certificate.CertificateRepository;
import com.airlock.iam.admin.application.service.certificate.CertificateService;
import com.airlock.iam.admin.domain.model.authmethod.AuthenticationMethod;
import com.airlock.iam.admin.domain.model.token.TokenController;
import com.airlock.iam.admin.domain.model.token.certificate.CertificateAuthenticationMethod;
import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.core.misc.persistency.token.TokenDataProvider;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.inject.Named;

public class CertificateServiceModule extends PrivateModule {
   @Provides
   CertificateTokenController tokenController(TokenController.TokenControllers tokenControllers) {
      return (CertificateTokenController)ServiceConfigurationException.checkPresent(
         tokenControllers.ofId("CERTIFICATE"), "Certificate token controller must be configured."
      );
   }

   @Provides
   TokenDataProvider tokenDataProvider(CertificateTokenController tokenController) {
      return tokenController.getTokenDataProvider();
   }

   @Provides
   @RequestScoped
   @Exposed
   @Named("CERTIFICATE")
   AuthenticationMethod provideAuthMethod(CertificateTokenController tokenController, CertificateService service) {
      return new CertificateAuthenticationMethod(service, tokenController.isAllowedAsActive());
   }

   protected void configure() {
      this.bind(CertificateRepository.class);
      this.bind(CertificateService.class);
      this.expose(CertificateService.class);
   }
}
