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

import com.airlock.iam.authentication.application.configuration.vasco.VascoOtpAuthStepConfig;
import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.common.api.domain.model.authmethod.AuthenticationMethod;
import com.airlock.iam.core.misc.impl.authen.AuthenticationMethodFactory;
import com.airlock.iam.core.misc.impl.tokenverifier.vasco.VascoTokenVerifier;
import com.airlock.iam.core.misc.tokenverifier.TokenVerifier;
import com.airlock.iam.flow.shared.domain.service.otp.NoOtpHistoryService;
import com.airlock.iam.flow.shared.domain.service.otp.OtpHistoryService;
import com.airlock.iam.flow.shared.domain.service.otp.OtpVerificationService;
import com.airlock.iam.flow.shared.domain.service.otp.TokenVerifierAdapter;
import com.airlock.iam.plugin.framework.application.service.builder.plugin.PluginPropertyBuilderInitializer;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;

@ModuleForConfig(VascoOtpAuthStepConfig.class)
public final class VascoOtpAuthenticationStepModule extends PrivateModule {
   @Provides
   TokenVerifier provideTokenVerifier(VascoOtpAuthStepConfig config) {
      return ((VascoTokenVerifier.VascoTokenVerifierBuilder)PluginPropertyBuilderInitializer.pluginBuilder(VascoTokenVerifier.VascoTokenVerifierBuilder.class))
         .vascoHandler(config.getVascoHandler())
         .tokenDataProvider(config.getTokenDataProvider())
         .build();
   }

   @Exposed
   @Provides
   AuthenticationMethod provideAuthenticationMethod(VascoOtpAuthStepConfig config) {
      return AuthenticationMethodFactory.authMethodFor(config.getAuthenticationMethodId());
   }

   protected void configure() {
      this.bind(OtpHistoryService.class).to(NoOtpHistoryService.class);
      this.bind(OtpVerificationService.class).to(TokenVerifierAdapter.class);
      this.expose(OtpVerificationService.class);
   }
}
