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

import com.airlock.iam.apipolicyservice.application.configuration.ApiPolicyServiceAppConfig;
import com.airlock.iam.apipolicyservice.application.service.ResolveTechClientService;
import com.airlock.iam.apipolicyservice.application.service.ResolveTechClientServiceImpl;
import com.airlock.iam.apipolicyservice.domain.model.ApiPolicyServiceTechClientViewRepository;
import com.airlock.iam.apipolicyservice.infrastructure.repository.ApiPolicyServiceTechClientViewRepositoryImpl;
import com.airlock.iam.base.api.domain.model.exception.ServiceConfigurationException;
import com.airlock.iam.common.domain.model.jwt.JwtSecret;
import com.airlock.iam.common.domain.service.jwt.JwtHmacAndAesGcmEncryptionImpl;
import com.airlock.iam.core.domain.service.jwt.JwtHmacAndAesGcmEncryption;
import com.airlock.iam.database.infrastructure.JooqConfig;
import com.airlock.iam.database.infrastructure.TenantId;
import com.airlock.iam.techclient.application.configuration.TechClientRepositoryConfig;
import com.airlock.iam.techclient.domain.model.TechClientRepositorySettings;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.inject.Named;
import java.util.List;

public class ApiPolicyServiceResolveTechClientServiceModule extends PrivateModule {
   protected void configure() {
      this.bind(ApiPolicyServiceTechClientViewRepository.class).to(ApiPolicyServiceTechClientViewRepositoryImpl.class).in(RequestScoped.class);
      this.bind(ResolveTechClientService.class).to(ResolveTechClientServiceImpl.class).in(RequestScoped.class);
      this.expose(ResolveTechClientService.class);
   }

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

   @Exposed
   @RequestScoped
   @Provides
   TechClientRepositorySettings provideTechClientRepositorySettings(ApiPolicyServiceAppConfig apiPolicyServiceAppConfig) {
      TechClientRepositoryConfig repository = apiPolicyServiceAppConfig.getRepository();
      return TechClientRepositorySettings.builder()
         .dataSource(repository.getSqlDataSource())
         .logQueries(repository.isLogQueries())
         .tenantId(TenantId.tenantId(repository.getTenantId()))
         .cipher(repository.getCipher())
         .storageEncryption(repository.getStorageEncryptionConfig())
         .build();
   }

   @RequestScoped
   @Provides
   @Named("API_KEY_SECRET_VALUE_ENCRYPTION")
   JwtHmacAndAesGcmEncryption macAndEncryption(TechClientRepositorySettings repositorySettings) {
      JwtSecret jwtSecret = repositorySettings.getStorageEncryption().getJwtSecret();
      return new JwtHmacAndAesGcmEncryptionImpl(jwtSecret.getJwtKeys());
   }

   @RequestScoped
   @Provides
   TechClientRepositoryConfig provideTechClientsConfig(ApiPolicyServiceAppConfig adminapp) {
      return (TechClientRepositoryConfig)ServiceConfigurationException.checkNotNull(adminapp.getRepository(), "Technical clients configuration is required");
   }
}
