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

import com.airlock.iam.common.application.service.session.AirlockControlCookieService;
import com.airlock.iam.common.domain.model.gateway.WafSettings;
import com.airlock.iam.common.domain.model.session.IamSession;
import com.airlock.iam.common.domain.service.SessionIdService;
import com.airlock.iam.common.domain.service.session.IamSessionService;
import com.airlock.iam.core.misc.SessionRenewalUtil;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Optional;

public final class SessionIdServiceImpl implements SessionIdService {
   private final Provider<HttpServletRequest> request;
   private final Provider<AirlockControlCookieService> controlCookieService;
   private final Provider<Optional<WafSettings>> wafSettings;
   private final Provider<IamSessionService<?>> sessionService;
   private final Provider<IamSession> iamSession;

   @Inject
   public SessionIdServiceImpl(
      Provider<HttpServletRequest> request,
      Provider<AirlockControlCookieService> controlCookieService,
      Provider<Optional<WafSettings>> wafSettings,
      Provider<IamSessionService<?>> sessionService,
      Provider<IamSession> iamSession
   ) {
      this.request = request;
      this.controlCookieService = controlCookieService;
      this.wafSettings = wafSettings;
      this.sessionService = sessionService;
      this.iamSession = iamSession;
   }

   @Override
   public void forceNewSessionId() {
      if (((Optional)this.wafSettings.get()).isPresent()) {
         ((AirlockControlCookieService)this.controlCookieService.get()).forceNewSessionId();
      }

      SessionRenewalUtil.changeSessionId((HttpServletRequest)this.request.get());
      ((IamSessionService)this.sessionService.get()).renewSessionNonce((IamSession)this.iamSession.get());
   }
}
