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

import com.airlock.iam.common.domain.model.session.IamSession;
import com.airlock.iam.common.domain.service.SessionService;
import com.airlock.iam.common.domain.service.session.IamSessionService;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;

public final class SessionServiceImpl implements SessionService {
   private static final ELogger LOG = ELoggerFactory.getLogger(SessionServiceImpl.class);
   static final String INVALIDATE_SESSION = "invalidateSessionAtEndOfRequest";
   private final Provider<HttpServletRequest> request;
   private final Provider<IamSessionService<?>> sessionService;
   private final Provider<IamSession> iamSession;

   @Inject
   public SessionServiceImpl(Provider<HttpServletRequest> request, Provider<IamSessionService<?>> sessionService, Provider<IamSession> iamSession) {
      this.request = request;
      this.sessionService = sessionService;
      this.iamSession = iamSession;
   }

   @Override
   public void terminateSessionAtEndOfRestRequest() {
      ((HttpServletRequest)this.request.get()).setAttribute("invalidateSessionAtEndOfRequest", true);
   }

   @Override
   public void terminateSession() {
      ((IamSessionService)this.sessionService.get()).removeSession(this.getSession());
      this.invalidateHttpSession();
   }

   @Override
   public boolean isSessionMarkedForTermination() {
      return ((HttpServletRequest)this.request.get()).getAttribute("invalidateSessionAtEndOfRequest") != null;
   }

   private void invalidateHttpSession() {
      HttpSession session = ((HttpServletRequest)this.request.get()).getSession(false);
      if (session == null) {
         LOG.debug("No session to invalidate.");
      } else {
         try {
            session.invalidate();
            LOG.debug("Invalidated HTTP session.");
         } catch (IllegalStateException var3) {
         }
      }
   }

   private <T extends IamSession> T getSession() {
      return (T)this.iamSession.get();
   }
}
