package dev.lions.unionflow.server.resource;

import dev.lions.unionflow.server.api.dto.kyc.KycDossierRequest;
import dev.lions.unionflow.server.api.dto.kyc.KycDossierResponse;
import dev.lions.unionflow.server.service.KycAmlService;
import io.quarkus.security.identity.SecurityIdentity;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;

import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * Endpoints KYC/AML — gestion des dossiers d'identification et évaluation risque LCB-FT.
 */
@Path("/api/kyc")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class KycResource {

    @Inject
    KycAmlService kycAmlService;

    @Inject
    SecurityIdentity identity;

    /** Soumet ou met à jour un dossier KYC pour un membre. */
    @POST
    @Path("/dossiers")
    @RolesAllowed({"ADMIN_ORGANISATION", "TRESORIER", "SUPER_ADMIN"})
    public Response soumettre(@Valid KycDossierRequest request) {
        KycDossierResponse response = kycAmlService.soumettreOuMettreAJour(request, identity.getPrincipal().getName());
        return Response.status(Response.Status.CREATED).entity(response).build();
    }

    /** Récupère le dossier KYC actif d'un membre. */
    @GET
    @Path("/membres/{membreId}")
    @RolesAllowed({"ADMIN_ORGANISATION", "TRESORIER", "SUPER_ADMIN"})
    public Response getDossierActif(@PathParam("membreId") UUID membreId) {
        return kycAmlService.getDossierActif(membreId)
                .map(d -> Response.ok(d).build())
                .orElse(Response.status(Response.Status.NOT_FOUND)
                        .entity(Map.of("error", "Aucun dossier KYC actif pour ce membre."))
                        .build());
    }

    /** Évalue le score de risque LCB-FT du membre. */
    @POST
    @Path("/membres/{membreId}/evaluer-risque")
    @RolesAllowed({"ADMIN_ORGANISATION", "TRESORIER", "SUPER_ADMIN"})
    public Response evaluerRisque(@PathParam("membreId") UUID membreId) {
        KycDossierResponse response = kycAmlService.evaluerRisque(membreId);
        return Response.ok(response).build();
    }

    /** Valide manuellement un dossier KYC (agent habilité). */
    @POST
    @Path("/dossiers/{dossierId}/valider")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION"})
    public Response valider(
            @PathParam("dossierId") UUID dossierId,
            @QueryParam("validateurId") UUID validateurId,
            @QueryParam("notes") String notes) {
        KycDossierResponse response = kycAmlService.valider(
                dossierId, validateurId, notes, identity.getPrincipal().getName());
        return Response.ok(response).build();
    }

    /** Refuse un dossier KYC avec motif. */
    @POST
    @Path("/dossiers/{dossierId}/refuser")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION"})
    public Response refuser(
            @PathParam("dossierId") UUID dossierId,
            @QueryParam("validateurId") UUID validateurId,
            @QueryParam("motif") String motif) {
        KycDossierResponse response = kycAmlService.refuser(
                dossierId, validateurId, motif, identity.getPrincipal().getName());
        return Response.ok(response).build();
    }

    /** Liste les dossiers KYC en attente de validation. */
    @GET
    @Path("/dossiers/en-attente")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION"})
    public List<KycDossierResponse> getDossiersEnAttente() {
        return kycAmlService.getDossiersEnAttente();
    }

    /** Liste les membres PEP (Personnes Exposées Politiquement). */
    @GET
    @Path("/pep")
    @RolesAllowed({"SUPER_ADMIN"})
    public List<KycDossierResponse> getPep() {
        return kycAmlService.getDossiersPep();
    }

    /** Pièces d'identité expirant dans les 30 jours. */
    @GET
    @Path("/pieces-expirant-bientot")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER"})
    public List<KycDossierResponse> getPiecesExpirant() {
        return kycAmlService.getPiecesExpirantDansLes30Jours();
    }
}
