package dev.lions.unionflow.client.service;

import dev.lions.unionflow.client.dto.EvenementDTO;
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 événements
 * Correspond exactement aux endpoints du backend EvenementResource
 * 
 * @author UnionFlow Team
 * @version 2.0
 */
@RegisterRestClient(configKey = "unionflow-api")
@Path("/api/evenements")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface EvenementService {
    
    /**
     * Liste tous les événements actifs avec pagination
     */
    @GET
    Map<String, Object> listerTous(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size,
        @QueryParam("sort") @DefaultValue("dateDebut") String sortField,
        @QueryParam("direction") @DefaultValue("asc") String sortDirection
    );
    
    /**
     * Récupère un événement par son ID
     */
    @GET
    @Path("/{id}")
    EvenementDTO obtenirParId(@PathParam("id") UUID id);
    
    /**
     * Crée un nouvel événement
     */
    @POST
    EvenementDTO creer(EvenementDTO evenement);
    
    /**
     * Met à jour un événement existant
     */
    @PUT
    @Path("/{id}")
    EvenementDTO modifier(@PathParam("id") UUID id, EvenementDTO evenement);
    
    /**
     * Supprime un événement
     */
    @DELETE
    @Path("/{id}")
    void supprimer(@PathParam("id") UUID id);
    
    /**
     * Liste les événements à venir
     */
    @GET
    @Path("/a-venir")
    Map<String, Object> listerAVenir(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("10") int size
    );
    
    /**
     * Recherche d'événements avec filtres
     */
    @GET
    @Path("/search")
    Map<String, Object> rechercher(
        @QueryParam("titre") String titre,
        @QueryParam("type") String type,
        @QueryParam("statut") String statut,
        @QueryParam("dateDebut") String dateDebut,
        @QueryParam("dateFin") String dateFin,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Liste les événements par statut
     */
    @GET
    @Path("/statut/{statut}")
    Map<String, Object> listerParStatut(
        @PathParam("statut") String statut,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Liste les événements par association
     */
    @GET
    @Path("/association/{associationId}")
    Map<String, Object> listerParAssociation(
        @PathParam("associationId") UUID associationId,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );
    
    /**
     * Compte le nombre d'événements
     */
    @GET
    @Path("/count")
    Map<String, Object> compter();
    
    /**
     * Inscrit un participant à un événement
     */
    @POST
    @Path("/{evenementId}/participants/{membreId}")
    void inscrireParticipant(@PathParam("evenementId") UUID evenementId, @PathParam("membreId") UUID membreId);
    
    /**
     * Désinscrit un participant d'un événement
     */
    @DELETE
    @Path("/{evenementId}/participants/{membreId}")
    void desinscrireParticipant(@PathParam("evenementId") UUID evenementId, @PathParam("membreId") UUID membreId);
    
    /**
     * Liste les participants d'un événement
     */
    @GET
    @Path("/{evenementId}/participants")
    List<Map<String, Object>> listerParticipants(@PathParam("evenementId") UUID evenementId);
}
