package dev.lions.btpxpress.service;

import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

/**
 * Interface REST Client pour communiquer avec l'API backend BTP Xpress.
 * <p>
 * Ce client permet au frontend PrimeFaces de communiquer avec le backend Quarkus
 * en utilisant les endpoints REST exposés sur /api/v1/*. L'authentification
 * est gérée automatiquement via les tokens JWT Keycloak.
 * </p>
 *
 * @author BTP Xpress Development Team
 * @version 1.0.0
 * @since 1.0.0
 */
@RegisterRestClient(configKey = "btpxpress.api")
@RegisterClientHeaders
@Path("/api/v1")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface BtpXpressApiClient {

    /**
     * Récupère la liste des chantiers.
     * Correspond à {@code ChantierResource.getAllChantiers()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des chantiers.
     */
    @GET
    @Path("/chantiers")
    Response getChantiers();

    /**
     * Récupère un chantier par son identifiant.
     * Correspond à {@code ChantierResource.getChantierById()} dans le serveur.
     *
     * @param id L'identifiant du chantier.
     * @return Réponse HTTP contenant le chantier.
     */
    @GET
    @Path("/chantiers/{id}")
    Response getChantier(@PathParam("id") Long id);

    /**
     * Récupère la liste des clients.
     * Correspond à {@code ClientResource.getAllClients()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des clients.
     */
    @GET
    @Path("/clients")
    Response getClients();

    /**
     * Récupère un client par son identifiant.
     * Correspond à {@code ClientResource.getClientById()} dans le serveur.
     *
     * @param id L'identifiant du client.
     * @return Réponse HTTP contenant le client.
     */
    @GET
    @Path("/clients/{id}")
    Response getClient(@PathParam("id") Long id);

    // === ENDPOINTS DASHBOARD ===

    /**
     * Récupère le dashboard principal avec les métriques globales.
     * Correspond à {@code DashboardResource.getDashboardPrincipal()} dans le serveur.
     *
     * @return Réponse HTTP contenant les métriques du dashboard.
     */
    @GET
    @Path("/dashboard")
    Response getDashboardPrincipal();

    /**
     * Récupère le dashboard des chantiers avec métriques détaillées.
     * Correspond à {@code DashboardResource.getDashboardChantiers()} dans le serveur.
     *
     * @return Réponse HTTP contenant les métriques des chantiers.
     */
    @GET
    @Path("/dashboard/chantiers")
    Response getDashboardChantiers();

    /**
     * Récupère les métriques financières.
     * Correspond à {@code DashboardResource.getDashboardFinances()} dans le serveur.
     *
     * @param periode Période en jours (défaut: 30).
     * @return Réponse HTTP contenant les métriques financières.
     */
    @GET
    @Path("/dashboard/finances")
    Response getDashboardFinances(@QueryParam("periode") @DefaultValue("30") int periode);

    /**
     * Récupère les métriques de maintenance.
     * Correspond à {@code DashboardResource.getDashboardMaintenance()} dans le serveur.
     *
     * @return Réponse HTTP contenant les métriques de maintenance.
     */
    @GET
    @Path("/dashboard/maintenance")
    Response getDashboardMaintenance();

    /**
     * Récupère les métriques des ressources (équipes, employés, matériel).
     * Correspond à {@code DashboardResource.getDashboardRessources()} dans le serveur.
     *
     * @return Réponse HTTP contenant les métriques des ressources.
     */
    @GET
    @Path("/dashboard/ressources")
    Response getDashboardRessources();

    /**
     * Récupère les alertes nécessitant une attention immédiate.
     * Correspond à {@code DashboardResource.getAlertes()} dans le serveur.
     *
     * @return Réponse HTTP contenant les alertes.
     */
    @GET
    @Path("/dashboard/alertes")
    Response getAlertes();

    /**
     * Récupère les KPIs principaux.
     * Correspond à {@code DashboardResource.getKPI()} dans le serveur.
     *
     * @param periode Période en jours (défaut: 30).
     * @return Réponse HTTP contenant les KPIs.
     */
    @GET
    @Path("/dashboard/kpi")
    Response getKPI(@QueryParam("periode") @DefaultValue("30") int periode);

    /**
     * Récupère les activités récentes.
     * Correspond à {@code DashboardResource.getActivitesRecentes()} dans le serveur.
     *
     * @param limit Nombre d'activités à récupérer (défaut: 10).
     * @return Réponse HTTP contenant les activités récentes.
     */
    @GET
    @Path("/dashboard/activites-recentes")
    Response getActivitesRecentes(@QueryParam("limit") @DefaultValue("10") int limit);

    /**
     * Récupère le résumé quotidien.
     * Correspond à {@code DashboardResource.getResumeQuotidien()} dans le serveur.
     *
     * @return Réponse HTTP contenant le résumé quotidien.
     */
    @GET
    @Path("/dashboard/resume-quotidien")
    Response getResumeQuotidien();

    /**
     * Récupère la liste des devis.
     * Correspond à {@code DevisResource.getAllDevis()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des devis.
     */
    @GET
    @Path("/devis")
    Response getDevis();

    /**
     * Récupère la liste des factures.
     * Correspond à {@code FactureResource.getAllFactures()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des factures.
     */
    @GET
    @Path("/factures")
    Response getFactures();
}

