package dev.lions.unionflow.client.service;

import dev.lions.unionflow.server.api.dto.cotisation.request.CreateCotisationRequest;
import dev.lions.unionflow.server.api.dto.cotisation.request.UpdateCotisationRequest;
import dev.lions.unionflow.server.api.dto.cotisation.response.CotisationResponse;
import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * Service REST client pour la gestion des cotisations
 * Interface correspondant exactement au backend CotisationResource
 * 
 * @author UnionFlow Team
 * @version 1.0
 */
@RegisterRestClient(configKey = "unionflow-api")
@RegisterClientHeaders(dev.lions.unionflow.client.security.AuthHeaderFactory.class)
@Path("/api/cotisations")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface CotisationService {
    
    /**
     * Récupère toutes les cotisations avec pagination
     */
    @GET
    List<CotisationResponse> listerToutes(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère une cotisation par son ID
     */
    @GET
    @Path("/{id}")
    CotisationResponse obtenirParId(@PathParam("id") UUID id);
    
    /**
     * Récupère une cotisation par son numéro de référence
     */
    @GET
    @Path("/reference/{numeroReference}")
    CotisationResponse obtenirParReference(@PathParam("numeroReference") String numeroReference);
    
    /**
     * Récupère les cotisations d'un membre
     */
    @GET
    @Path("/membre/{membreId}")
    List<CotisationResponse> obtenirParMembre(
        @PathParam("membreId") UUID membreId,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère les cotisations par statut
     */
    @GET
    @Path("/statut/{statut}")
    List<CotisationResponse> obtenirParStatut(
        @PathParam("statut") String statut,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère les cotisations en retard
     */
    @GET
    @Path("/en-retard")
    List<CotisationResponse> obtenirEnRetard(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Recherche avancée de cotisations
     */
    @GET
    @Path("/recherche")
    List<CotisationResponse> rechercher(
        @QueryParam("membreId") UUID membreId,
        @QueryParam("statut") String statut,
        @QueryParam("typeCotisation") String typeCotisation,
        @QueryParam("annee") Integer annee,
        @QueryParam("mois") Integer mois,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère les statistiques des cotisations
     */
    @GET
    @Path("/stats")
    Map<String, Object> obtenirStatistiques();
    
    /**
     * Crée une nouvelle cotisation
     */
    @POST
    CotisationResponse creer(CreateCotisationRequest request);
    
    /**
     * Met à jour une cotisation existante
     */
    @PUT
    @Path("/{id}")
    CotisationResponse modifier(@PathParam("id") UUID id, UpdateCotisationRequest request);
    
    /**
     * Supprime une cotisation
     */
    @DELETE
    @Path("/{id}")
    void supprimer(@PathParam("id") UUID id);
    
    /**
     * Enregistre le paiement d'une cotisation (endpoint dédié backend).
     * Corps attendu : { montantPaye, datePaiement, modePaiement, reference }
     */
    @PUT
    @Path("/{id}/payer")
    @Consumes(MediaType.APPLICATION_JSON)
    CotisationResponse payer(@PathParam("id") UUID id, Map<String, Object> paiementData);

    /**
     * Récupère les cotisations du membre connecté (authentification JWT).
     */
    @GET
    @Path("/mes-cotisations")
    List<CotisationResponse> getMesCotisations(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );

    /**
     * Récupère les cotisations en attente du membre connecté.
     */
    @GET
    @Path("/mes-cotisations/en-attente")
    List<CotisationResponse> getMesCotisationsEnAttente();

    /**
     * Envoie des rappels de cotisations groupés à plusieurs membres (WOU/DRY)
     */
    @POST
    @Path("/rappels/groupes")
    @Consumes(MediaType.APPLICATION_JSON)
    Map<String, Integer> envoyerRappelsGroupes(List<UUID> membreIds);
}

