package com.airlock.iam.admin.infrastructure.resource.prot.user;

import com.airlock.iam.admin.application.service.user.UserValidityService;
import com.airlock.iam.admin.domain.model.user.UserSpecificSettings;
import com.airlock.iam.admin.infrastructure.service.user.UserIdResolver;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.log.api.helpdesk.HelpdeskLogger;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
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.Consumes;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;

@Path("/users/{userId}/validity/enable")
@Consumes("application/json")
@Produces({"application/vnd.api+json", "application/json;qs=0.9"})
public class UserValidityEnabledResource {
   private final Provider<UserValidityService> validityService;
   private final Provider<UserSpecificSettings> settings;
   private final HelpdeskLogger helpdeskLogger;
   private final Provider<UserIdResolver> userIdResolver;

   @Inject
   public UserValidityEnabledResource(
      Provider<UserValidityService> userValidityServiceProvider,
      Provider<UserSpecificSettings> settings,
      HelpdeskLogger logger,
      Provider<UserIdResolver> userIdResolver
   ) {
      this.validityService = userValidityServiceProvider;
      this.settings = settings;
      this.helpdeskLogger = logger;
      this.userIdResolver = userIdResolver;
   }

   @ApiResponses(
      {
            @ApiResponse(responseCode = "204", description = "The user has been enabled."),
            @ApiResponse(
               responseCode = "403",
               description = "The user is not editable.",
               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"))
               }
            ),
            @ApiResponse(
               responseCode = "404",
               description = "The user does not exist.",
               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"))
               }
            )
      }
   )
   @POST
   @Consumes("application/json")
   @Operation(
      description = "Enables the user.\n<div class=\"iam-resource-return\">A Response containing a particular if the user could have been enabled.</div>",
      tags = "Users",
      summary = "Enable the user"
   )
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   public Response enable(@PathParam("userId") @Parameter(schema = @Schema(type = "string")) String userIdParam) {
      UserId userId = ((UserIdResolver)this.userIdResolver.get()).resolve(userIdParam);
      ((UserSpecificSettings)this.settings.get()).failIfUserNotEditable();
      ((UserValidityService)this.validityService.get()).enable(userId.getValue());
      this.helpdeskLogger.log(userId, "Administrator ${authentee} enabled user ${affectedUser}.");
      return Response.noContent().build();
   }

   @ApiResponses(
      {
            @ApiResponse(responseCode = "204", description = "The user has been disabled."),
            @ApiResponse(
               responseCode = "403",
               description = "The user is not editable.",
               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"))
               }
            ),
            @ApiResponse(
               responseCode = "404",
               description = "The user does not exist.",
               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"))
               }
            )
      }
   )
   @DELETE
   @Operation(
      description = "Disables the user.\n<div class=\"iam-resource-return\">A Response containing a particular status if the user could have been disabled.</div>",
      tags = "Users",
      summary = "Disable the user"
   )
   @Consumes("application/json")
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   public Response disable(@PathParam("userId") @Parameter(schema = @Schema(type = "string")) String userIdParam) {
      UserId userId = ((UserIdResolver)this.userIdResolver.get()).resolve(userIdParam);
      ((UserSpecificSettings)this.settings.get()).failIfUserNotEditable();
      ((UserValidityService)this.validityService.get()).disable(userId.getValue());
      this.helpdeskLogger.log(userId, "Administrator ${authentee} disabled user ${affectedUser}.");
      return Response.noContent().build();
   }
}
