package com.airlock.iam.authentication.infrastructure.resource.oneshot;

import com.airlock.iam.authentication.application.service.ApplicationAccessService;
import com.airlock.iam.authentication.infrastructure.service.oneshot.OneShotResponseService;
import com.airlock.iam.common.api.infrastructure.annotation.DisableCsrfFilter;
import com.airlock.iam.common.api.infrastructure.annotation.DisableResponseDelay;
import com.airlock.iam.common.api.infrastructure.annotation.RequiresWritableSession;
import com.airlock.iam.flow.api.domain.model.flow.ApplicationId;
import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.extensions.Extension;
import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.validation.constraints.Size;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Response;

@Path("one-shot/")
public final class OneShotAuthenticationResource {
   private final Provider<ApplicationAccessService> service;
   private final Provider<OneShotResponseService> responseService;

   @Inject
   public OneShotAuthenticationResource(Provider<ApplicationAccessService> service, Provider<OneShotResponseService> responseService) {
      this.service = service;
      this.responseService = responseService;
   }

   @Operation(extensions = @Extension(properties = @ExtensionProperty(name = "x-internal", value = "true")))
   @GET
   @Path("/applications/{applicationId}")
   @DisableCsrfFilter
   @DisableResponseDelay
   @RequiresWritableSession
   public Response access(@PathParam("applicationId") @Size(min = 1, max = 30) String applicationId, @QueryParam("Location") String location) {
      FlowResult result = ((ApplicationAccessService)this.service.get()).accessOneShot(ApplicationId.applicationId(applicationId));
      return ((OneShotResponseService)this.responseService.get()).createResponse(result);
   }
}
