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

import ch.ergon.restal.jsonapi.document.data.ResourceDocument;
import com.airlock.iam.base.infrastructure.mapper.entity.RestMapper;
import com.airlock.iam.common.api.infrastructure.annotation.RequiresWritableSession;
import com.airlock.iam.flow.api.domain.model.flow.FlowId;
import com.airlock.iam.flow.ui.infrastructure.settings.FlowFailureRedirectSettings;
import com.airlock.iam.publicselfservice.infrastructure.service.ui.OnCompletedPublicSelfServiceSettings;
import com.airlock.iam.publicselfservice.infrastructure.service.ui.PublicSelfServiceUiService;
import com.airlock.iam.publicselfservice.infrastructure.transfer.ui.OnCompletedPublicSelfServiceData;
import com.airlock.iam.publicselfservice.infrastructure.transfer.ui.OnFailurePublicSelfServiceData;
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.Produces;
import jakarta.ws.rs.core.Response;

@Path("/ui")
public class PublicSelfServiceUiConfigurationResource {
   private final Provider<PublicSelfServiceUiService> service;
   private final RestMapper mapper;

   @Inject
   public PublicSelfServiceUiConfigurationResource(Provider<PublicSelfServiceUiService> service, RestMapper mapper) {
      this.service = service;
      this.mapper = mapper;
   }

   @Operation(extensions = @Extension(properties = @ExtensionProperty(name = "x-internal", value = "true")))
   @GET
   @Path("/on-completed/{flowId}")
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   @RequiresWritableSession
   public Response getOnCompletedInfo(@PathParam("flowId") @Size(min = 1, max = 30) String id) {
      FlowId flowId = new FlowId(id);
      OnCompletedPublicSelfServiceSettings settings = this.service().getOnCompletedSettings(flowId);
      return this.toResponse(flowId, settings);
   }

   @Operation(extensions = @Extension(properties = @ExtensionProperty(name = "x-internal", value = "true")))
   @GET
   @Path("/on-failure/{flowId}")
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   @RequiresWritableSession
   public Response getOnFailureInfo(@PathParam("flowId") @Size(min = 1, max = 30) String id) {
      FlowId flowId = new FlowId(id);
      FlowFailureRedirectSettings settings = this.service().getOnFailureSettings(flowId);
      return this.toResponse(flowId, settings);
   }

   private Response toResponse(FlowId flowId, OnCompletedPublicSelfServiceSettings settings) {
      ResourceDocument<OnCompletedPublicSelfServiceData> document = this.mapper
         .forElement(settings, OnCompletedPublicSelfServiceData.class)
         .withIdSupplier(s -> flowId.getFlowId())
         .toResourceDocument();
      return Response.ok(document).build();
   }

   private Response toResponse(FlowId flowId, FlowFailureRedirectSettings settings) {
      ResourceDocument<OnFailurePublicSelfServiceData> document = this.mapper
         .forElement(settings, OnFailurePublicSelfServiceData.class)
         .withIdSupplier(s -> flowId.getFlowId())
         .toResourceDocument();
      return Response.ok(document).build();
   }

   private PublicSelfServiceUiService service() {
      return (PublicSelfServiceUiService)this.service.get();
   }
}
