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

import com.airlock.iam.admin.application.configuration.secretquestion.SecretQuestionsTokenController;
import com.airlock.iam.admin.application.service.token.secretquestions.SecretQuestionsAdminService;
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.secretquestion.SecretQuestionAuthenticationMethod;
import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.common.application.configuration.secretquestion.GeneralSecretQuestionsSettings;
import com.airlock.iam.common.application.configuration.secretquestion.SecretQuestionsSettings;
import com.airlock.iam.common.domain.model.token.secretquestions.SecretQuestionsRepository;
import com.airlock.iam.common.domain.service.secretquestions.SecretQuestionsService;
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 SecretQuestionsAdminServiceModule extends PrivateModule {
   @Provides
   UserStore provideUserStore(SecretQuestionsTokenController tokenController) {
      return tokenController.getUserStoreProvider().getUserStore();
   }

   @Provides
   SecretQuestionsTokenController provideSecretQuestionsTokenController(TokenController.TokenControllers tokenControllers) {
      return (SecretQuestionsTokenController)ServiceConfigurationException.checkPresent(
         tokenControllers.ofId("SECRET_QUESTIONS"), "Secret questions token controller not configured."
      );
   }

   @Provides
   SecretQuestionsSettings provideSecretQuestionsSettings(SecretQuestionsTokenController tokenController) {
      return tokenController.getSecretQuestionsSettings();
   }

   @Provides
   SecretQuestionsRepository provideSecretQuestionsRepository(GeneralSecretQuestionsSettings settings) {
      return new SecretQuestionsRepository(settings);
   }

   @Exposed
   @Provides
   @RequestScoped
   @Named("SECRET_QUESTIONS")
   AuthenticationMethod provideAuthenticationMethod(SecretQuestionsAdminService service) {
      return SecretQuestionAuthenticationMethod.builder().secretQuestionsService(service).build();
   }

   protected void configure() {
      this.bind(GeneralSecretQuestionsSettings.class).to(SecretQuestionsSettings.class);
      this.bind(SecretQuestionsService.class).in(RequestScoped.class);
      this.bind(SecretQuestionsAdminService.class).in(RequestScoped.class);
      this.expose(SecretQuestionsAdminService.class);
   }
}
