package com.airlock.iam.flow.shared.infrastructure.factory;

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.factor.application.configuration.fido.FidoRepositoryConfig;
import com.airlock.iam.factor.application.configuration.fido.FidoSettingsConfig;
import com.airlock.iam.factor.domain.model.fido.FidoCredentialRepository;
import com.airlock.iam.factor.domain.model.fido.FidoUserRepository;
import com.airlock.iam.factor.infrastructure.repository.fido.FidoJooqConfigFactory;
import com.airlock.iam.factor.infrastructure.repository.fido.FidoRepositorySettings;
import com.airlock.iam.factor.infrastructure.service.fido.FidoCredentialRepositoryImpl;
import com.airlock.iam.factor.infrastructure.service.fido.FidoUserRepositoryImpl;
import com.airlock.iam.fido.api.domain.model.FidoRelyingPartyId;
import com.airlock.iam.flow.shared.application.configuration.step.FidoCredentialConditionConfig;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;

@ModuleForConfig(FidoCredentialConditionConfig.class)
public class FidoCredentialConditionModule extends PrivateModule {
   @Provides
   FidoSettingsConfig provideFidoSettings(FidoCredentialConditionConfig config) {
      return config.getFidoSettings();
   }

   @Exposed
   @Provides
   FidoRelyingPartyId provideFidoRelyingPartyId(FidoSettingsConfig fidoConfig) {
      return FidoRelyingPartyId.relyingPartyId(fidoConfig.getRelyingPartyId());
   }

   @Provides
   FidoRepositoryConfig provideFidoRepositoryConfig(FidoSettingsConfig fidoConfig) {
      return fidoConfig.getRepository();
   }

   @Provides
   FidoRepositorySettings provideFidoRepositorySettings(FidoRepositoryConfig repositoryConfig) {
      return new FidoRepositorySettings(FidoJooqConfigFactory.createJooqConfig(repositoryConfig), repositoryConfig.isPersistTransports());
   }

   protected void configure() {
      this.bind(FidoUserRepository.class).to(FidoUserRepositoryImpl.class);
      this.expose(FidoUserRepository.class);
      this.bind(FidoCredentialRepository.class).to(FidoCredentialRepositoryImpl.class);
      this.expose(FidoCredentialRepository.class);
   }
}
