package dev.lions.unionflow.client.service;

import dev.lions.unionflow.server.api.dto.common.PagedResponse;
import dev.lions.unionflow.server.api.dto.evenement.response.EvenementResponse;
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 événements
 * Correspond exactement aux endpoints du backend EvenementResource
 * 
 * @author UnionFlow Team
 * @version 2.0
 */
@RegisterRestClient(configKey = "unionflow-api")
@RegisterClientHeaders(dev.lions.unionflow.client.security.AuthHeaderFactory.class)
@Path("/api/evenements")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface EvenementService {
    
    /**
     * Liste tous les événements actifs avec pagination
     */
    @GET
    PagedResponse<EvenementResponse> 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}")
    EvenementResponse obtenirParId(@PathParam("id") UUID id);
    
    /**
     * Crée un nouvel événement
     */
    @POST
    EvenementResponse creer(EvenementResponse evenement);
    
    /**
     * Met à jour un événement existant
     */
    @PUT
    @Path("/{id}")
    EvenementResponse modifier(@PathParam("id") UUID id, EvenementResponse evenement);
    
    /**
     * Supprime un événement
     */
    @DELETE
    @Path("/{id}")
    void supprimer(@PathParam("id") UUID id);
    
    /**
     * Liste les événements à venir
     */
    @GET
    @Path("/a-venir")
    PagedResponse<EvenementResponse> listerAVenir(
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("10") int size
    );

    /**
     * Recherche d'événements — backend: GET /api/evenements/recherche
     */
    @GET
    @Path("/recherche")
    List<EvenementResponse> rechercher(
        @QueryParam("q") String q,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("size") @DefaultValue("20") int size
    );

    /**
     * Événements par type — backend: GET /api/evenements/type/{type}
     */
    @GET
    @Path("/type/{type}")
    List<EvenementResponse> listerParType(
        @PathParam("type") String type,
        @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 le membre connecté à un événement
     * Backend: POST /api/evenements/{id}/inscriptions (membre résolu via SecurityIdentity)
     */
    @POST
    @Path("/{evenementId}/inscriptions")
    void inscrireParticipant(@PathParam("evenementId") UUID evenementId);

    /**
     * Désinscrit le membre connecté d'un événement
     * Backend: DELETE /api/evenements/{id}/inscriptions (membre résolu via SecurityIdentity)
     */
    @DELETE
    @Path("/{evenementId}/inscriptions")
    void desinscrireParticipant(@PathParam("evenementId") UUID evenementId);

    /**
     * Liste les participants d'un événement
     */
    @GET
    @Path("/{evenementId}/participants")
    List<Map<String, Object>> listerParticipants(@PathParam("evenementId") UUID evenementId);
}
