package dev.lions.unionflow.server.resource;

import dev.lions.unionflow.server.api.dto.config.request.ParametresLcbFtRequest;
import dev.lions.unionflow.server.api.dto.config.response.ParametresLcbFtResponse;
import dev.lions.unionflow.server.service.ParametresLcbFtService;
import jakarta.annotation.security.PermitAll;
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 lombok.extern.slf4j.Slf4j;
import org.eclipse.microprofile.openapi.annotations.Operation;
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
import org.eclipse.microprofile.openapi.annotations.tags.Tag;

import java.math.BigDecimal;
import java.util.UUID;

/**
 * Resource REST pour les paramètres LCB-FT (seuils anti-blanchiment).
 *
 * @author lions dev Team
 * @version 1.0
 * @since 2026-03-13
 */
@Path("/api/parametres-lcb-ft")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Tag(name = "Paramètres LCB-FT", description = "Gestion des seuils anti-blanchiment (LCB-FT)")
@Slf4j
public class ParametresLcbFtResource {

    @Inject
    ParametresLcbFtService parametresService;

    /**
     * Récupère les paramètres LCB-FT pour une organisation et une devise.
     * Endpoint utilisé par le mobile pour valider côté client.
     *
     * @param organisationId ID de l'organisation (optionnel, null pour paramètres plateforme)
     * @param codeDevise Code devise ISO 4217 (XOF par défaut)
     * @return Paramètres LCB-FT complets
     */
    @GET
    @PermitAll
    @Operation(
        summary = "Récupérer les paramètres LCB-FT",
        description = "Retourne les seuils anti-blanchiment pour une organisation ou la plateforme"
    )
    @APIResponse(responseCode = "200", description = "Paramètres récupérés")
    @APIResponse(responseCode = "404", description = "Paramètres non configurés")
    public Response getParametres(
            @QueryParam("organisationId")
            @Parameter(description = "ID de l'organisation (optionnel)")
            String organisationId,

            @QueryParam("codeDevise")
            @DefaultValue("XOF")
            @Parameter(description = "Code devise (XOF par défaut)")
            String codeDevise) {

        log.info("GET /api/parametres-lcb-ft?organisationId={}&codeDevise={}",
                 organisationId, codeDevise);

        UUID orgId = organisationId != null && !organisationId.isBlank() ?
            UUID.fromString(organisationId) : null;

        ParametresLcbFtResponse params = parametresService.getParametres(orgId, codeDevise);
        return Response.ok(params).build();
    }

    /**
     * Récupère uniquement le seuil de justification (endpoint léger pour mobile).
     *
     * @param organisationId ID de l'organisation
     * @param codeDevise Code devise (XOF par défaut)
     * @return Montant seuil
     */
    @GET
    @Path("/seuil-justification")
    @PermitAll
    @Operation(
        summary = "Récupérer le seuil de justification uniquement",
        description = "Endpoint léger pour récupérer juste le montant seuil (utilisé par mobile)"
    )
    @APIResponse(responseCode = "200", description = "Seuil récupéré")
    public Response getSeuilJustification(
            @QueryParam("organisationId") String organisationId,
            @QueryParam("codeDevise") @DefaultValue("XOF") String codeDevise) {

        log.debug("GET /api/parametres-lcb-ft/seuil-justification");

        UUID orgId = organisationId != null && !organisationId.isBlank() ?
            UUID.fromString(organisationId) : null;

        BigDecimal seuil = parametresService.getSeuilJustification(orgId, codeDevise);
        return Response.ok().entity(new SeuilResponse(seuil, codeDevise)).build();
    }

    /**
     * Crée ou met à jour les paramètres LCB-FT (admin uniquement).
     *
     * @param request Paramètres à créer/mettre à jour
     * @return Paramètres créés/mis à jour
     */
    @POST
    @RolesAllowed({ "ADMIN", "SUPER_ADMIN" })
    @Operation(
        summary = "Créer ou mettre à jour les paramètres LCB-FT",
        description = "Admin uniquement - Configure les seuils pour une organisation ou la plateforme"
    )
    @APIResponse(responseCode = "200", description = "Paramètres sauvegardés")
    public Response saveOrUpdateParametres(@Valid ParametresLcbFtRequest request) {
        log.info("POST /api/parametres-lcb-ft - org={}", request.getOrganisationId());

        ParametresLcbFtResponse saved = parametresService.saveOrUpdateParametres(request);
        return Response.ok(saved).build();
    }

    /**
     * DTO léger pour retourner uniquement le seuil.
     */
    public record SeuilResponse(
        BigDecimal montantSeuil,
        String codeDevise
    ) {}
}
