package dev.lions.unionflow.client.service;

import dev.lions.unionflow.server.api.dto.finance.request.*;
import dev.lions.unionflow.server.api.dto.finance.response.*;
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.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * Service REST client pour la gestion des adhésions
 * Interface correspondant exactement au backend AdhesionResource
 * 
 * @author UnionFlow Team
 * @version 1.0
 */
@RegisterRestClient(configKey = "unionflow-api")
@RegisterClientHeaders(dev.lions.unionflow.client.security.AuthHeaderFactory.class)
@Path("/api/adhesions")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface AdhesionService {
    
    /**
     * Récupère toutes les adhésions avec pagination
     */
    @GET
    List<AdhesionResponse> listerToutes(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère une adhésion par son ID
     */
    @GET
    @Path("/{id}")
    AdhesionResponse obtenirParId(@PathParam("id") UUID id);
    
    /**
     * Récupère une adhésion par son numéro de référence
     */
    @GET
    @Path("/reference/{numeroReference}")
    AdhesionResponse obtenirParReference(@PathParam("numeroReference") String numeroReference);
    
    /**
     * Crée une nouvelle adhésion
     */
    @POST
    AdhesionResponse creer(CreateAdhesionRequest adhesion);

    /**
     * Met à jour une adhésion existante
     */
    @PUT
    @Path("/{id}")
    AdhesionResponse modifier(@PathParam("id") UUID id, UpdateAdhesionRequest adhesion);
    
    /**
     * Supprime une adhésion
     */
    @DELETE
    @Path("/{id}")
    void supprimer(@PathParam("id") UUID id);
    
    /**
     * Approuve une adhésion
     */
    @POST
    @Path("/{id}/approuver")
    AdhesionResponse approuver(
        @PathParam("id") UUID id,
        @QueryParam("approuvePar") String approuvePar
    );
    
    /**
     * Rejette une adhésion
     */
    @POST
    @Path("/{id}/rejeter")
    AdhesionResponse rejeter(
        @PathParam("id") UUID id,
        @QueryParam("motifRejet") String motifRejet
    );
    
    /**
     * Enregistre un paiement pour une adhésion
     */
    @POST
    @Path("/{id}/paiement")
    AdhesionResponse enregistrerPaiement(
        @PathParam("id") UUID id,
        @QueryParam("montantPaye") BigDecimal montantPaye,
        @QueryParam("methodePaiement") String methodePaiement,
        @QueryParam("referencePaiement") String referencePaiement
    );
    
    /**
     * Récupère les adhésions d'un membre
     */
    @GET
    @Path("/membre/{membreId}")
    List<AdhesionResponse> obtenirParMembre(
        @PathParam("membreId") UUID membreId,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère les adhésions d'une organisation
     */
    @GET
    @Path("/organisation/{organisationId}")
    List<AdhesionResponse> obtenirParOrganisation(
        @PathParam("organisationId") UUID organisationId,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère les adhésions par statut
     */
    @GET
    @Path("/statut/{statut}")
    List<AdhesionResponse> obtenirParStatut(
        @PathParam("statut") String statut,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère les adhésions en attente
     */
    @GET
    @Path("/en-attente")
    List<AdhesionResponse> obtenirEnAttente(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Récupère les statistiques des adhésions
     */
    @GET
    @Path("/stats")
    Map<String, Object> obtenirStatistiques();
}

