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

import com.airlock.iam.admin.application.configuration.cronto.CrontoTokenController;
import com.airlock.iam.admin.application.service.token.cronto.CrontoAdminService;
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.cronto.CrontoAuthenticationMethod;
import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.core.misc.cronto.CrontoHandler;
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;
import java.util.Optional;

public class CrontoAdminServiceModule extends PrivateModule {
   @Provides
   CrontoTokenController provideTokenController(TokenController.TokenControllers tokenControllers) {
      Optional<CrontoTokenController> tokenController = tokenControllers.ofId("CRONTO");
      return (CrontoTokenController)ServiceConfigurationException.checkPresent(tokenController, "Cronto token controller must be configured.");
   }

   @Provides
   CrontoHandler provideCrontoHandlerForTokenController(CrontoTokenController controller) {
      return controller.getCrontoHandler();
   }

   @Provides
   @RequestScoped
   @Exposed
   @Named("CRONTO")
   AuthenticationMethod provideAuthMethod(CrontoTokenController controller, CrontoAdminService service) {
      return CrontoAuthenticationMethod.builder()
         .crontoHandler(controller.getCrontoHandler())
         .configuredId(controller.getConfiguredId())
         .autoOrderOnAuthMethodAdd(controller.isAutoOrder())
         .service(service)
         .build();
   }

   protected void configure() {
      this.bind(CrontoAdminService.class).in(RequestScoped.class);
      this.expose(CrontoAdminService.class);
   }
}
