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

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.common.application.configuration.security.StorageEncryptionConfig;
import com.airlock.iam.database.infrastructure.JooqConfig;
import com.airlock.iam.oauth2.application.configuration.OAuth2AuthorizationServerConfigSpec;
import com.airlock.iam.security.util.crypto.StringCipher;
import com.airlock.iam.techclient.auth.domain.service.repository.oauth2.OAuth2TechClientRepository;
import com.airlock.iam.techclient.auth.infrastructure.repository.oauth2.OAuth2TechClientRepositoryImpl;
import com.airlock.iam.techclient.domain.model.TechClientRepositorySettings;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.List;

public class OAuth2ClientRepositoryModule extends PrivateModule {
   @Provides
   TechClientRepositorySettings provideTechnicalClientRepositorySettings(OAuth2AuthorizationServerConfigSpec configSpec) {
      return ViolationException.checkPresent(configSpec.getRepositorySettings(), "Tech client repository not configured for Authorization Server");
   }

   @Provides
   JooqConfig provideJooqConfig(TechClientRepositorySettings repositorySettings) {
      return new JooqConfig(
         repositorySettings.getDataSource(),
         repositorySettings.getDataSource().getDbType(),
         null,
         List.of(),
         repositorySettings.isLogQueries(),
         repositorySettings.getTenantId()
      );
   }

   @Provides
   StringCipher provideStringCipher(TechClientRepositorySettings repositorySettings) {
      return repositorySettings.getCipher();
   }

   @Provides
   StorageEncryptionConfig provideStorageEncryption(TechClientRepositorySettings repositorySettings) {
      return repositorySettings.getStorageEncryption();
   }

   protected void configure() {
      this.bind(OAuth2TechClientRepository.class).to(OAuth2TechClientRepositoryImpl.class);
      this.expose(OAuth2TechClientRepository.class);
   }
}
