package com.airlock.iam.login.app.infrastructure.web;

import com.airlock.iam.common.infrastructure.i18n.I18nCache;
import com.airlock.iam.common.infrastructure.i18n.I18nRequest;
import com.airlock.iam.common.infrastructure.i18n.I18nResource;
import com.airlock.iam.common.infrastructure.i18n.ServletContextBasedJsonLoader;
import com.airlock.iam.common.infrastructure.i18n.ServletContextBasedPropertiesLoader;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Optional;
import org.apache.commons.lang3.Strings;

public class I18nServlet extends HttpServlet {
   private static final String DEFAULT_I8N_ASSETS_PATH = "/assets/airlock/i18n";
   private static final String CUSTOM_I18N_ASSETS_PATH = "/assets/custom/i18n";
   private I18nCache cache;

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
      I18nRequest i18nRequest = getUiResourceSetName(req)
         .map(name -> I18nRequest.createI18nRequest(req, resp, Strings.CS.removeStart("/ui", "/"), "/assets/airlock/i18n", "/assets/custom/i18n", name))
         .orElse(I18nRequest.createI18nRequest(req, resp, Strings.CS.removeStart("/ui", "/"), "/assets/airlock/i18n", "/assets/custom/i18n"));
      I18nResource resource = this.cache.getResource(i18nRequest);
      resource.applyTo(i18nRequest);
   }

   public void init(ServletConfig config) throws ServletException {
      super.init(config);
      this.cache = new I18nCache(
         new ServletContextBasedJsonLoader(config.getServletContext()),
         new ServletContextBasedPropertiesLoader(config.getServletContext()),
         I18nCache.CacheType.MUTABLE
      );
   }

   private static Optional<String> getUiResourceSetName(HttpServletRequest request) {
      return Optional.ofNullable(request.getAttribute("uiResourceSetName")).filter(String.class::isInstance).map(String.class::cast);
   }
}
