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

import com.airlock.iam.admin.domain.model.analytics.EncryptedAnalytics;
import com.airlock.iam.admin.infrastructure.service.analytics.AnalyticsSubmission;
import com.airlock.iam.admin.infrastructure.service.analytics.AnalyticsSubmissionService;
import com.airlock.iam.admin.infrastructure.transfer.response.analytics.AnalyticsSubmissionData;
import io.swagger.v3.oas.annotations.Operation;
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.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import java.util.Optional;

@Path("/usage-data")
public class AnalyticsDataResource {
   private final Provider<AnalyticsSubmissionService> service;

   @Inject
   public AnalyticsDataResource(Provider<AnalyticsSubmissionService> service) {
      this.service = service;
   }

   @ApiResponses(
      {
            @ApiResponse(
               responseCode = "200",
               description = "Usage analytics data retrieved successfully.",
               content = @Content(mediaType = "application/json", schema = @Schema(implementation = AnalyticsSubmissionData.class))
            ),
            @ApiResponse(responseCode = "204", description = "No analytics data is available.", content = @Content(mediaType = "application/json"))
      }
   )
   @GET
   @Operation(
      summary = "Retrieve IAM analytics",
      tags = "Analytics",
      description = "Internal endpoint to retrieve license and usage analytics.\nWhether analytics are provided depends on the configuration of the License and Usage Analytics Setting in the Adminapp.\n<div class=\"iam-resource-return\">The analytics.</div>",
      extensions = @Extension(properties = @ExtensionProperty(name = "x-internal", value = "true"))
   )
   @Produces("application/json")
   public Response getAnalytics() {
      Optional<AnalyticsSubmission> analytics = ((AnalyticsSubmissionService)this.service.get()).analyticsSubmission();
      return analytics.isEmpty() ? Response.noContent().build() : Response.ok().entity(mapToDto(analytics.get())).build();
   }

   private static AnalyticsSubmissionData mapToDto(AnalyticsSubmission submission) {
      EncryptedAnalytics encryptedData = submission.encryptedData();
      return new AnalyticsSubmissionData(encryptedData.data(), encryptedData.wrappedKey(), submission.accessToken());
   }
}
