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

import com.airlock.iam.apipolicyservice.application.configuration.ApiPolicyServiceAppConfig;
import com.airlock.iam.common.application.configuration.RestConfigSpec;
import com.airlock.iam.common.application.configuration.logging.CorrelationIdSettingsConfig;
import com.airlock.iam.common.application.configuration.templock.TemporaryLockingConfig;
import com.airlock.iam.common.application.locale.LocalePreferenceConfiguration;
import com.airlock.iam.common.application.service.SystemAvailabilityService;
import com.airlock.iam.common.infrastructure.event.OutboxEventPublisher;
import com.airlock.iam.core.misc.authen.UsernameTransformationManager;
import com.airlock.iam.core.misc.authorization.AccessController;
import com.airlock.iam.log.processor.LogMessageProcessor;
import com.airlock.iam.log.processor.NopLogMessageProcessor;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
import com.google.inject.servlet.RequestScoped;
import java.util.Optional;

public class ApiPolicyServiceInfrastructureModule extends PrivateModule {
   @Exposed
   @Provides
   Optional<AccessController> provideAccessController() {
      return Optional.empty();
   }

   @Exposed
   @Provides
   Optional<TemporaryLockingConfig> provideTemporaryLockingConfig() {
      return Optional.empty();
   }

   @Exposed
   @Provides
   LocalePreferenceConfiguration provideLocalePreferenceConfiguration() {
      throw new IllegalStateException("Locale Preference Configurations / Language Settings are not supported in the API Policy Service.");
   }

   @Exposed
   @Provides
   RestConfigSpec provideRestConfigSpec(ApiPolicyServiceAppConfig config) {
      return config;
   }

   @Exposed
   @Provides
   UsernameTransformationManager provideUsernameTransformationManager(RestConfigSpec config) {
      return new UsernameTransformationManager(config.getUsernameTransformers());
   }

   @Exposed
   @Provides
   @RequestScoped
   Optional<CorrelationIdSettingsConfig> provideCorrelationIdSettingsConfig(ApiPolicyServiceAppConfig apiPolicyService) {
      return apiPolicyService.getCorrelationIdSettingsConfig();
   }

   protected void configure() {
      this.bind(new TypeLiteral<Optional<SystemAvailabilityService>>() {}).toInstance(Optional.empty());
      this.expose(new TypeLiteral<Optional<SystemAvailabilityService>>() {});
      this.bind(LogMessageProcessor.class).to(NopLogMessageProcessor.class);
      this.expose(LogMessageProcessor.class);
      this.bind(new TypeLiteral<Optional<OutboxEventPublisher>>() {}).toInstance(Optional.empty());
      this.expose(new TypeLiteral<Optional<OutboxEventPublisher>>() {});
   }
}
