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

import ch.ergon.restal.jsonapi.document.data.ResourceDocument;
import ch.ergon.restal.jsonapi.document.data.ResourceObject;
import com.airlock.iam.admin.infrastructure.generated.transfer.response.user.UserStatisticsDataResourceDocument;
import com.airlock.iam.admin.infrastructure.service.user.UserIdResolver;
import com.airlock.iam.admin.infrastructure.transfer.response.user.UserStatisticsData;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
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.Named;
import jakarta.inject.Provider;
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;
import ma.glasnost.orika.MapperFacade;

@Path("/users/{userId}/statistics")
public class UserStatisticsResource {
   private final MapperFacade mapper;
   private final Provider<UserStore> userStoreProvider;
   private final Provider<UserIdResolver> userIdResolver;

   @Inject
   public UserStatisticsResource(
      MapperFacade mapper, @Named("MANAGED_USERS_STORE") Provider<UserStore> userStoreProvider, Provider<UserIdResolver> userIdResolver
   ) {
      this.mapper = mapper;
      this.userStoreProvider = userStoreProvider;
      this.userIdResolver = userIdResolver;
   }

   @ApiResponses(
      {
            @ApiResponse(
               responseCode = "200",
               description = "The response contains the requested user statistics.",
               content = {
                     @Content(mediaType = "application/vnd.api+json", schema = @Schema(implementation = UserStatisticsDataResourceDocument.class)),
                     @Content(mediaType = "application/json", schema = @Schema(implementation = UserStatisticsDataResourceDocument.class))
               }
            ),
            @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"))
               }
            )
      }
   )
   @GET
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   @Operation(
      description = "Retrieves user statistics.\n<div class=\"iam-resource-return\">The requested user statistics.</div>",
      tags = "Users",
      summary = "Get user statistics"
   )
   public Response retrieveStatistics(@PathParam("userId") @Parameter(schema = @Schema(type = "string")) String userIdParam) {
      UserId userId = ((UserIdResolver)this.userIdResolver.get()).resolve(userIdParam);
      PersistentUser persistentUser = ((UserStore)this.userStoreProvider.get()).getByIdentity(userId);
      ResourceDocument<UserStatisticsData> document = ResourceObject.builder(
            userId.getValue(), (UserStatisticsData)this.mapper.map(persistentUser, UserStatisticsData.class)
         )
         .document();
      return Response.ok(document).build();
   }
}
