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

import com.airlock.iam.admin.application.service.user.OAuth2AdminService;
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.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;

@Path("/users/{userId}/tokens/oauth2")
public class UserOAuth2Resource {
   private final Provider<OAuth2AdminService> oauth2Service;
   private final HelpdeskLogger helpdeskLogger;
   private final Provider<UserIdResolver> userIdResolver;

   @Inject
   public UserOAuth2Resource(Provider<OAuth2AdminService> oauth2Service, HelpdeskLogger helpdeskLogger, Provider<UserIdResolver> userIdResolver) {
      this.oauth2Service = oauth2Service;
      this.helpdeskLogger = helpdeskLogger;
      this.userIdResolver = userIdResolver;
   }

   @ApiResponses(
      {
            @ApiResponse(responseCode = "204", description = "The tokens have been deleted successfully."),
            @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 = "Deletes the user's OAuth 2.0 Tokens.\n<div class=\"iam-resource-return\">Information about whether the OAuth 2.0 Tokens have been deleted successfully.</div>",
      tags = "OAuth 2.0/OIDC",
      summary = "Delete OAuth tokens"
   )
   @Consumes("application/json")
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   public Response deleteOAuth2Tokens(@PathParam("userId") @Parameter(schema = @Schema(type = "string")) String userIdParam) {
      UserId userId = ((UserIdResolver)this.userIdResolver.get()).resolve(userIdParam);
      int numberOfOAuth2Tokens = this.oauth2Service().clearAllOAuth2TokensForUser(userId);
      this.helpdeskLogger
         .log(userId, "Administrator ${authentee} deleted all %d OAuth 2.0 Tokens for user ${affectedUser}.", new Object[]{numberOfOAuth2Tokens});
      return Response.status(Status.NO_CONTENT).build();
   }

   private OAuth2AdminService oauth2Service() {
      return (OAuth2AdminService)this.oauth2Service.get();
   }
}
