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

import com.airlock.iam.admin.application.configuration.administrators.AdministratorsConfiguration;
import com.airlock.iam.admin.application.service.AdminappSessionTerminationService;
import com.airlock.iam.admin.application.service.authentication.AdminappAuthenticationService;
import com.airlock.iam.admin.application.service.authentication.AdminappAuthenticationServiceImpl;
import com.airlock.iam.common.application.service.session.SessionTerminationService;
import com.airlock.iam.core.misc.authen.Authenticator;
import com.airlock.iam.core.misc.authen.UsernameTransformationManager;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.Optional;

public class AdminappAuthenticationServiceModule extends PrivateModule {
   @Provides
   Optional<Authenticator> provideAuthenticator(AdministratorsConfiguration adminsConfig) {
      return Optional.ofNullable(adminsConfig.getAdminAuthenticator());
   }

   @Provides
   UsernameTransformationManager provideUsernameTransformationManager(AdministratorsConfiguration adminsConfig) {
      return new UsernameTransformationManager(adminsConfig.getUsernameTransformers());
   }

   protected void configure() {
      this.bind(SessionTerminationService.class).to(AdminappSessionTerminationService.class).in(RequestScoped.class);
      this.expose(SessionTerminationService.class);
      this.bind(AdminappAuthenticationService.class).to(AdminappAuthenticationServiceImpl.class).in(RequestScoped.class);
      this.expose(AdminappAuthenticationService.class);
   }
}
