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

import com.airlock.iam.core.application.configuration.waf.AirlockGatewayConfig;
import com.airlock.iam.core.misc.util.airlock.AirlockControlCookie;
import com.airlock.iam.log.audit.AuditLogger;
import com.airlock.iam.login.app.misc.util.ServletConfigUtils;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.util.Optional;

public class OneShotLogoutServlet extends ExceptionWrapperServlet {
   @Override
   protected void handleRequest(HttpServletRequest request, HttpServletResponse response, ConfigurationContext context) throws Exception {
      terminateAirlockSession(response, context);
      HttpSession httpSession = request.getSession(false);
      if (httpSession != null && httpSession.isNew()) {
         httpSession.invalidate();
      }
   }

   private static void terminateAirlockSession(HttpServletResponse response, ConfigurationContext context) {
      Optional<AirlockGatewayConfig> alConfig = ServletConfigUtils.findGatewayConfig(context);
      if (!alConfig.isEmpty()) {
         AirlockControlCookie ac = new AirlockControlCookie();
         ac.terminateSession();
         ac.forceNewSessionId();
         response.addCookie(ac.getControlCookie(alConfig.get().getControlCookieName()));
         AuditLogger.log(
            OneShotLogoutServlet.class, LogTypes.SET_AIRLOCK_CONTROL_COOKIE, "Setting Airlock control cookie (value): \"" + ac.getCookieValue() + "\""
         );
      }
   }
}
