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

import com.airlock.iam.common.api.infrastructure.annotation.DisableResponseDelay;
import com.airlock.iam.common.api.infrastructure.annotation.RequiresWritableSession;
import com.airlock.iam.common.infrastructure.request.RequestMethodInfo;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.container.ResourceInfo;
import jakarta.ws.rs.core.UriInfo;
import java.lang.reflect.Method;
import java.net.URI;

public final class RequestMethodInfoModule extends PrivateModule {
   @Provides
   @Exposed
   @RequestScoped
   RequestMethodInfo provideRequestMethodInfo(ResourceInfo resourceInfo, UriInfo uriInfo) {
      URI requestUri = uriInfo.getRequestUri();
      Method method = resourceInfo.getResourceMethod();
      if (method == null) {
         return RequestMethodInfo.builder()
            .methodExists(false)
            .sessionLessEndpoint(true)
            .uiEndpoint(false)
            .responseDelayDisabled(true)
            .oneShotEndpoint(false)
            .requestUri(requestUri)
            .build();
      }

      boolean isSessionLess = method.isAnnotationPresent(GET.class) && !method.isAnnotationPresent(RequiresWritableSession.class);
      return RequestMethodInfo.builder()
         .methodExists(true)
         .sessionLessEndpoint(isSessionLess)
         .uiEndpoint(requestUri.toASCIIString().contains("/ui/"))
         .responseDelayDisabled(method.isAnnotationPresent(DisableResponseDelay.class))
         .oneShotEndpoint(requestUri.toASCIIString().contains("/one-shot/"))
         .requestUri(requestUri)
         .build();
   }

   protected void configure() {
   }
}
