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

import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.common.api.domain.service.Interceptor;
import com.airlock.iam.common.infrastructure.interceptor.InterceptorManager;
import com.airlock.iam.database.infrastructure.JooqConfig;
import com.airlock.iam.techclient.admin.application.service.PlainTechClientService;
import com.airlock.iam.techclient.admin.domain.model.PlainTechClientRepository;
import com.airlock.iam.techclient.admin.infrastructure.repository.PlainTechClientRepositoryImpl;
import com.airlock.iam.techclient.domain.model.TechClientRepositorySettings;
import com.airlock.iam.techclient.domain.model.TechClientSettings;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.List;
import java.util.stream.Collectors;

public class PlainTechClientServiceModule extends PrivateModule {
   @Provides
   JooqConfig provideJooqConfig(TechClientRepositorySettings settings) {
      return new JooqConfig(settings.getDataSource(), settings.getDataSource().getDbType(), null, List.of(), settings.isLogQueries(), settings.getTenantId());
   }

   @Provides
   InterceptorManager provideInterceptorManager(TechClientSettings techClientSettings, PluginConfigToLogic configToLogic) {
      List<Interceptor> interceptors = techClientSettings.interceptorConfigs()
         .stream()
         .map(config -> (Interceptor)configToLogic.getLogic(config))
         .collect(Collectors.toList());
      return new InterceptorManager(interceptors);
   }

   protected void configure() {
      this.bind(PlainTechClientRepository.class).to(PlainTechClientRepositoryImpl.class);
      this.bind(PlainTechClientService.class).in(RequestScoped.class);
      this.expose(PlainTechClientService.class);
   }
}
