package com.airlock.iam.login.app.misc.util;

import com.airlock.iam.common.application.configuration.language.LanguageSettings;
import com.airlock.iam.core.application.configuration.waf.AirlockGatewayConfig;
import com.airlock.iam.core.misc.util.ServletUtils;
import com.airlock.iam.core.misc.util.airlock.AirlockEnvCookie;
import com.airlock.iam.login.app.misc.configuration.Loginapp;
import com.airlock.iam.login.app.misc.displaylanguage.BrowserLanguageExtractor;
import com.airlock.iam.login.app.misc.displaylanguage.DisplayLanguage;
import com.airlock.iam.login.app.misc.displaylanguage.DisplayLanguageExtractor;
import com.airlock.iam.login.app.misc.ip.ClientIpAddress;
import com.airlock.iam.login.application.configuration.gateway.LoginappGatewayConfig;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Locale;
import java.util.Optional;

public final class ServletConfigUtils {
   public static Optional<AirlockGatewayConfig> findGatewayConfig(ConfigurationContext context) {
      return Loginapp.get(context).getGatewayConfig().map(LoginappGatewayConfig::getAirlockGatewaySettings);
   }

   public static Optional<String> determineSslSessionId(HttpServletRequest request, ConfigurationContext context) {
      return Optional.ofNullable(ServletUtils.getSslSessionId(request, airlockEnvironmentCookiePrefix(context)));
   }

   public static Locale determineDisplayLanguage(HttpServletRequest request, ConfigurationContext context) {
      LanguageSettings settings = Loginapp.get(context).getLanguageSettings();
      DisplayLanguageExtractor extractor = new BrowserLanguageExtractor(request);
      return Locale.forLanguageTag(extractor.extract(settings).map(DisplayLanguage::getLanguage).orElse(settings.getDefaultLanguage()));
   }

   public static ClientIpAddress determineClientIpAddress(HttpServletRequest request, ConfigurationContext context) {
      ClientIpAddress clientIp = new ClientIpAddress(request, findGatewayConfig(context).orElse(null));
      clientIp.rememberForLoggingOf(request);
      return clientIp;
   }

   private static String airlockEnvironmentCookiePrefix(ConfigurationContext context) {
      return AirlockEnvCookie.getAirlockEnvironmentCookiePrefix(findGatewayConfig(context).orElse(null));
   }

   private ServletConfigUtils() {
   }
}
