package com.airlock.iam.publicselfservice.infrastructure.resource;

import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import com.airlock.iam.flow.api.infrastructure.mapper.FlowResultMapper;
import com.airlock.iam.publicselfservice.api.infrastructure.generated.transfer.response.PublicSelfServiceFlowResultDataResourceDocument;
import com.airlock.iam.ssi.application.service.Ssi;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.extensions.Extension;
import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Response;

@Path("/ssi")
public class PublicSelfServiceSsiResource {
   private final FlowResultMapper mapper;
   private final Provider<Ssi> ssi;

   @Inject
   public PublicSelfServiceSsiResource(FlowResultMapper mapper, Provider<Ssi> ssi) {
      this.mapper = mapper;
      this.ssi = ssi;
   }

   @ApiResponses(
      {
            @ApiResponse(
               responseCode = "200",
               description = "Verification not yet completed (retry later), public self-service successful or further steps required.\n<br>Possible next step: <tt>SSI_PROOF_VERIFICATION_REQUIRED</tt> (as documented <a href=\"#nextPublicSelfServiceStepCodes\">here</a>).\n",
               content = {
                     @Content(mediaType = "application/vnd.api+json", schema = @Schema(implementation = PublicSelfServiceFlowResultDataResourceDocument.class)),
                     @Content(mediaType = "application/json", schema = @Schema(implementation = PublicSelfServiceFlowResultDataResourceDocument.class))
               }
            ),
            @ApiResponse(
               responseCode = "403",
               description = "<div class=\"iam-error-code\"><table>\n<tr>\n<td>SSI_VERIFICATION_FAILED</td>\n<td>The SSI verification has failed.</td>\n</tr>\n</table>\n</div>\n<br>The current public self-service flow has been aborted.\n",
               content = {
                     @Content(mediaType = "application/vnd.api+json", schema = @Schema(ref = "json-api.yaml#/components/schemas/ErrorDocumentResponse")),
                     @Content(mediaType = "application/json", schema = @Schema(ref = "json-api.yaml#/components/schemas/ErrorDocumentResponse"))
               }
            )
      }
   )
   @Operation(
      description = "> [!warning]\n> <strong>EXPERIMENTAL</strong>: This endpoint is under active development and subject to change. Avoid using it in production clients.\n<p>Allows polling whether the presentation has been received and verified.</p>\n<div class=\"iam-resource-return\">The proof verification status.\n The attribute <tt>nextStep</tt> defines the next flow step (can be the current step, if further polling is required).</div>",
      extensions = @Extension(properties = @ExtensionProperty(name = "x-scalar-stability", value = "experimental")),
      tags = "SSI",
      summary = "Poll presentation"
   )
   @POST
   @Path("/verification/poll")
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   public Response pollProofVerification(
      @Parameter(
   description = "Whether the final result should be returned (optional, default <tt>false</tt>). See <a href=\"#pollingEndpoints\">polling endpoints</a> for details."
) @QueryParam("queryOnly") boolean queryOnly
   ) {
      FlowResult result = ((Ssi)this.ssi.get()).pollProofVerification(queryOnly);
      return this.mapper.toResponse(result);
   }
}
