package com.airlock.iam.core.misc;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

public final class SessionRenewalUtil {
   private SessionRenewalUtil() {
      throw new AssertionError();
   }

   public static HttpSession changeSessionId(HttpServletRequest request) {
      Map<String, Object> attributesToMigrate = createAttributeMap(request.getSession());
      HttpSession newSession = renewHttpSession(request);
      transferAttributes(attributesToMigrate, newSession);
      return newSession;
   }

   private static Map<String, Object> createAttributeMap(HttpSession session) {
      Map<String, Object> attributesToMigrate = new HashMap<>();
      Enumeration<?> attributeNames = session.getAttributeNames();

      while (attributeNames.hasMoreElements()) {
         String name = (String)attributeNames.nextElement();
         attributesToMigrate.put(name, session.getAttribute(name));
      }

      return attributesToMigrate;
   }

   public static HttpSession renewHttpSession(HttpServletRequest request) {
      HttpSession session = request.getSession();
      int maxInactiveInterval = session.getMaxInactiveInterval();
      session.invalidate();
      HttpSession newSession = request.getSession(true);
      newSession.setMaxInactiveInterval(maxInactiveInterval);
      return newSession;
   }

   private static void transferAttributes(Map<String, Object> attributes, HttpSession newSession) {
      if (attributes != null) {
         attributes.forEach(newSession::setAttribute);
      }
   }
}
