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

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.database.infrastructure.JooqConfig;
import com.airlock.iam.database.infrastructure.TenantId;
import com.airlock.iam.factor.application.configuration.fido.FidoRepositoryConfig;
import com.airlock.iam.factor.domain.model.fido.FidoAuthenticatorMetadataRegistry;
import com.airlock.iam.factor.domain.model.fido.FidoAuthenticatorMetadataRegistryImpl;
import com.airlock.iam.factor.domain.model.fido.FidoUserCredentialFactory;
import com.airlock.iam.factor.domain.model.fido.FidoUserCredentialFactoryImpl;
import com.airlock.iam.factor.domain.model.fido.FidoUserCredentialRepository;
import com.airlock.iam.factor.domain.model.fido.registration.FidoExistingAttestationObjectFactory;
import com.airlock.iam.factor.domain.model.fido.registration.FidoExistingAttestationObjectFactoryImpl;
import com.airlock.iam.factor.infrastructure.repository.fido.FidoRepositorySettings;
import com.airlock.iam.factor.infrastructure.repository.fido.FidoUserCredentialRepositoryImpl;
import com.airlock.iam.flow.shared.application.configuration.step.ApplyFidoCredentialDisplayNameChangeConfig;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.List;

@ModuleForConfig(ApplyFidoCredentialDisplayNameChangeConfig.class)
public final class ApplyFidoCredentialDisplayNameChangeModule extends PrivateModule {
   @Provides
   FidoRepositoryConfig provideRepositoryConfig(ApplyFidoCredentialDisplayNameChangeConfig config) {
      return config.getFidoSettings().getRepository();
   }

   @Provides
   FidoRepositorySettings provideJooqConfig(FidoRepositoryConfig settings) {
      return new FidoRepositorySettings(
         new JooqConfig(
            settings.getSqlDataSource(),
            settings.getSqlDataSource().getDbType(),
            null,
            List.of(),
            settings.isLogQueries(),
            TenantId.tenantId(settings.getTenantId())
         ),
         settings.isPersistTransports()
      );
   }

   @Provides
   FidoExistingAttestationObjectFactory provideAttestationObjectFactory() {
      return FidoExistingAttestationObjectFactoryImpl.fidoExistingAttestationObjectFactory();
   }

   @Provides
   FidoAuthenticatorMetadataRegistry provideFidoAuthenticatorRegistry() {
      return FidoAuthenticatorMetadataRegistryImpl.builder().build();
   }

   protected void configure() {
      this.bind(FidoUserCredentialFactory.class).to(FidoUserCredentialFactoryImpl.class);
      this.bind(FidoUserCredentialRepository.class).to(FidoUserCredentialRepositoryImpl.class);
      this.expose(FidoUserCredentialRepository.class);
   }
}
