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

import com.airlock.iam.core.misc.util.RequestAwareThreadLocal;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Optional;
import lombok.NonNull;

public final class RequestThreadContext {
   private static final RequestAwareThreadLocal<RequestThreadContext> THREAD_LOCAL = new RequestAwareThreadLocal<>();
   @NonNull
   private final HttpServletRequest request;
   @NonNull
   private final HttpServletResponse response;
   private ConfigurationContext context = ConfigurationContext.defaultContext();

   public static void setRequestAndResponse(HttpServletRequest request, HttpServletResponse response) {
      THREAD_LOCAL.set(new RequestThreadContext(request, response));
   }

   private static Optional<RequestThreadContext> get() {
      return Optional.ofNullable(THREAD_LOCAL.get());
   }

   public static ConfigurationContext getConfigurationContext() {
      return get().get().context;
   }

   public static void setConfigurationContext(ConfigurationContext contextToSet) {
      get().get().context = contextToSet;
   }

   public static HttpServletRequest getRequest() {
      return get().get().request;
   }

   public static HttpServletResponse getResponse() {
      return get().get().response;
   }

   @SuppressFBWarnings(justification = "generated code")
   public RequestThreadContext(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response) {
      if (request == null) {
         throw new NullPointerException("request is marked non-null but is null");
      }

      if (response == null) {
         throw new NullPointerException("response is marked non-null but is null");
      }

      this.request = request;
      this.response = response;
   }
}
