package com.airlock.iam.admin.infrastructure.factory.prot;

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.techclient.admin.application.service.ApiKeyService;
import com.airlock.iam.techclient.admin.domain.model.ApiKeyTechClientRepository;
import com.airlock.iam.techclient.admin.infrastructure.repository.ApiKeyTechClientRepositoryImpl;
import com.airlock.iam.techclient.domain.model.TechClientRepositorySettings;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.inject.Named;
import java.util.Collections;

public class ApiKeyServiceModule extends PrivateModule {
   @Provides
   JooqConfig jooqConfig(TechClientRepositorySettings repositorySettings) {
      return new JooqConfig(
         repositorySettings.getDataSource(),
         repositorySettings.getDataSource().getDbType(),
         null,
         Collections.emptyList(),
         repositorySettings.isLogQueries(),
         repositorySettings.getTenantId()
      );
   }

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

   protected void configure() {
      this.bind(ApiKeyTechClientRepository.class).to(ApiKeyTechClientRepositoryImpl.class);
      this.bind(ApiKeyService.class).in(RequestScoped.class);
      this.expose(ApiKeyService.class);
   }
}
