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

import com.airlock.iam.authentication.application.configuration.airlock2fa.Airlock2FAMobileOnlyAuthenticationStepConfig;
import com.airlock.iam.authentication.domain.model.airlock2fa.Airlock2FAMobileOnlyAuthenticationStepSession;
import com.airlock.iam.authentication.domain.model.airlock2fa.Airlock2FAMobileOnlyAuthenticationStepSettings;
import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.factor.application.configuration.airlock2fa.Airlock2FASettings;
import com.airlock.iam.factor.domain.model.airlock2fa.Airlock2FADeviceSettings;
import com.airlock.iam.factor.domain.model.airlock2fa.Airlock2FAFactor;
import com.airlock.iam.factor.domain.model.airlock2fa.Airlock2FAFactorPriority;
import com.airlock.iam.factor.domain.service.airlock2fa.Airlock2FAApprovalAuthTokenIdService;
import com.airlock.iam.factor.domain.service.airlock2fa.Airlock2FAAuthenticationService;
import com.airlock.iam.factor.domain.service.airlock2fa.QrCodeImageReader;
import com.airlock.iam.factor.infrastructure.rest.airlock2fa.Airlock2FAAuthenticationServiceImpl;
import com.airlock.iam.factor.infrastructure.rest.airlock2fa.futurae.FuturaeAuthenticationRequestFactory;
import com.airlock.iam.factor.infrastructure.rest.airlock2fa.futurae.QrCodeImageReaderImpl;
import com.airlock.iam.flow.api.domain.model.session.FlowSession;
import com.airlock.iam.flow.infrastructure.step.StepSessionModuleHelper;
import com.airlock.iam.flow.shared.infrastructure.factory.Airlock2FAModuleForConfigBase;
import com.google.inject.Exposed;
import com.google.inject.Provides;
import java.util.Optional;

@ModuleForConfig(Airlock2FAMobileOnlyAuthenticationStepConfig.class)
public class Airlock2FAMobileOnlyAuthenticationStepModule extends Airlock2FAModuleForConfigBase {
   @Provides
   @Exposed
   Airlock2FAMobileOnlyAuthenticationStepSettings provideAirlock2FAMobileOnlyAuthenticationStepSettings(
      Airlock2FASettings airlock2FASettings, Airlock2FAMobileOnlyAuthenticationStepConfig config
   ) {
      return new Airlock2FAMobileOnlyAuthenticationStepSettings(
         config.getRedirectUri(),
         Optional.ofNullable(config.getSchemeOverride()),
         airlock2FASettings.isAllowFuturaeBypassMode(),
         new Airlock2FADeviceSettings(
            Airlock2FAFactorPriority.of(Airlock2FAFactor.MOBILE_ONLY), config.getCooldownSettings(), airlock2FASettings.getPayloadEncryptionSettings()
         )
      );
   }

   @Provides
   Airlock2FASettings provideAirlock2FASettings(Airlock2FAMobileOnlyAuthenticationStepConfig config) {
      return config.getAirlock2faSettings();
   }

   @Exposed
   @Provides
   Optional<Airlock2FAMobileOnlyAuthenticationStepSession> provideAirlock2FAMobileOnlyAuthenticationStepSession(FlowSession flowSession) {
      return StepSessionModuleHelper.tryRetrieveStepSession(flowSession, Airlock2FAMobileOnlyAuthenticationStepSession.class);
   }

   @Exposed
   @Provides
   Optional<Airlock2FAApprovalAuthTokenIdService> provideAirlock2FAApprovalAuthTokenIdService() {
      return Optional.empty();
   }

   @Override
   protected void configure() {
      super.configure();
      this.bind(FuturaeAuthenticationRequestFactory.class);
      this.bind(Airlock2FAAuthenticationService.class).to(Airlock2FAAuthenticationServiceImpl.class);
      this.expose(Airlock2FAAuthenticationService.class);
      this.bind(QrCodeImageReader.class).to(QrCodeImageReaderImpl.class);
   }
}
