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

import com.airlock.iam.admin.application.service.permission.AdminappPermissionsService;
import com.airlock.iam.admin.infrastructure.service.ume.UserManagementExtensionService;
import com.airlock.iam.base.infrastructure.error.ErrorResponse;
import com.airlock.iam.common.api.infrastructure.annotation.DisableCsrfFilter;
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 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;

@Path("/adminapp")
public class UserManagementExtensionResource {
   public static final String USER_MANAGEMENT_EXTENSION_JS_FILE = "user-management-extensions.js";
   private static final String TEXT_JAVASCRIPT = "text/javascript";
   private final Provider<UserManagementExtensionService> userManagementExtensionService;
   private final Provider<AdminappPermissionsService> permissionService;

   @Inject
   public UserManagementExtensionResource(
      Provider<UserManagementExtensionService> userManagementExtensionService, Provider<AdminappPermissionsService> permissionService
   ) {
      this.userManagementExtensionService = userManagementExtensionService;
      this.permissionService = permissionService;
   }

   @ApiResponse(
      description = "Retrieved user management extensions.",
      responseCode = "200",
      content = @Content(mediaType = "text/javascript", schema = @Schema(type = "string"))
   )
   @GET
   @Operation(extensions = @Extension(properties = @ExtensionProperty(name = "x-internal", value = "true")))
   @Produces("text/javascript")
   @DisableCsrfFilter
   @Path("/user-management-extensions.js")
   public Response userManagementExtensions() {
      return this.isUnauthorized()
         ? this.unauthorized()
         : ((UserManagementExtensionService)this.userManagementExtensionService.get())
            .getUserManagementExtension()
            .map(ume -> Response.ok(ume.content()).build())
            .orElse(ErrorResponse.notFound().build().toResponse());
   }

   private boolean isUnauthorized() {
      AdminappPermissionsService.SystemPermissions permissions = ((AdminappPermissionsService)this.permissionService.get()).getPermissions();
      return permissions.getStartPage().isEmpty();
   }

   private Response unauthorized() {
      return ErrorResponse.unauthorized().header("WWW-Authenticate", "None").log(this.getUnauthorizedReason()).build().toResponse();
   }

   private String getUnauthorizedReason() {
      AdminappPermissionsService.SystemPermissions permissions = ((AdminappPermissionsService)this.permissionService.get()).getPermissions();
      return permissions.getStartPage().isEmpty()
         ? "The current administrator has no permissions to access any of the Adminapp pages. This happens if the administrator is lacking the required roles."
         : "Access is not allowed";
   }
}
