package dev.lions.unionflow.client.service;

import dev.lions.unionflow.client.dto.CotisationDTO;
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")
@Path("/api/cotisations")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface CotisationService {
    
    /**
     * Récupère toutes les cotisations avec pagination
     */
    @GET
    List<CotisationDTO> listerToutes(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère une cotisation par son ID
     */
    @GET
    @Path("/{id}")
    CotisationDTO obtenirParId(@PathParam("id") UUID id);
    
    /**
     * Récupère une cotisation par son numéro de référence
     */
    @GET
    @Path("/reference/{numeroReference}")
    CotisationDTO obtenirParReference(@PathParam("numeroReference") String numeroReference);
    
    /**
     * Récupère les cotisations d'un membre
     */
    @GET
    @Path("/membre/{membreId}")
    List<CotisationDTO> 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<CotisationDTO> 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<CotisationDTO> obtenirEnRetard(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Recherche avancée de cotisations
     */
    @GET
    @Path("/recherche")
    List<CotisationDTO> 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
    CotisationDTO creer(CotisationDTO cotisation);
    
    /**
     * Met à jour une cotisation existante
     */
    @PUT
    @Path("/{id}")
    CotisationDTO modifier(@PathParam("id") UUID id, CotisationDTO cotisation);
    
    /**
     * Supprime une cotisation
     */
    @DELETE
    @Path("/{id}")
    void supprimer(@PathParam("id") UUID id);
}

