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

import com.airlock.iam.authentication.application.configuration.targetapp.TargetApplicationsConfig;
import com.airlock.iam.authentication.application.configuration.ui.AuthenticationUiConfig;
import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.login.api.domain.model.location.interpret.LocationInterpreters;
import com.airlock.iam.login.application.service.location.LocationService;
import com.airlock.iam.login.domain.model.location.interpret.LocationInterpretersImpl;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Pattern;

public class LocationServiceModule extends PrivateModule {
   @Provides
   @Exposed
   LocationService provideLocationService(
      Optional<TargetApplicationsConfig> flowAuthenticationConfig, Optional<AuthenticationUiConfig> uiConfig, PluginConfigToLogic configToLogic
   ) {
      List<LocationInterpreters> interpreters = new ArrayList<>();
      createInterpreterForSpa(uiConfig, configToLogic).ifPresent(interpreters::add);
      flowAuthenticationConfig.stream()
         .flatMap(config -> config.getLocationInterpreters().stream())
         .map(configToLogic::getLogic)
         .map(LocationInterpreters.class::cast)
         .forEach(interpreters::add);
      return new LocationService(interpreters);
   }

   private static Optional<LocationInterpreters> createInterpreterForSpa(Optional<AuthenticationUiConfig> uiConfig, PluginConfigToLogic toLogic) {
      return uiConfig.flatMap(AuthenticationUiConfig::getLanguageExtractor)
         .map(config -> new LocationInterpretersImpl(Pattern.compile(".*"), Map.of("IAM_UI_LANGUAGE", toLogic.getLogic(config))));
   }

   protected void configure() {
   }
}
