package com.airlock.iam.common.infrastructure.servlet;

import com.airlock.iam.common.infrastructure.RequestPathUtil;
import com.airlock.iam.core.misc.util.ServletUtils;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.apache.commons.lang3.StringUtils;

public class ErrorPageServlet extends HttpServlet {
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      this.processError(request, response);
   }

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      this.processError(request, response);
   }

   private void processError(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String originalRequestUri = (String)request.getAttribute("jakarta.servlet.error.request_uri");
      if (StringUtils.isEmpty(originalRequestUri)) {
         this.forward(request, response, "/error_static.html");
      } else if (RequestPathUtil.isRestApiCall(ServletUtils.getContextPath(request), originalRequestUri)) {
         response.setHeader("Content-Type", "application/json");
         response.setContentLength(0);
         response.flushBuffer();
      } else {
         switch (response.getStatus()) {
            case 401:
               this.forward(request, response, "/error_static_401.html");
               break;
            case 404:
               this.forward(request, response, "/error_static_404.html");
               break;
            default:
               this.forward(request, response, "/error_static.html");
         }
      }
   }

   @SuppressFBWarnings(value = "REQUESTDISPATCHER_FILE_DISCLOSURE", justification = "Target is always static")
   private void forward(HttpServletRequest request, HttpServletResponse response, String page) throws ServletException, IOException {
      request.getRequestDispatcher(page).forward(request, response);
   }
}
