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);

    /**
     * Crée un nouveau chantier.
     * Correspond à {@code ChantierResource.createChantier()} dans le serveur.
     *
     * @param chantierDTO Les données du chantier à créer.
     * @return Réponse HTTP contenant le chantier créé.
     */
    @POST
    @Path("/chantiers")
    Response createChantier(Object chantierDTO);

    /**
     * Met à jour un chantier existant.
     * Correspond à {@code ChantierResource.updateChantier()} dans le serveur.
     *
     * @param id L'identifiant du chantier.
     * @param chantierDTO Les nouvelles données du chantier.
     * @return Réponse HTTP contenant le chantier mis à jour.
     */
    @PUT
    @Path("/chantiers/{id}")
    Response updateChantier(@PathParam("id") String id, Object chantierDTO);

    /**
     * Supprime un chantier.
     * Correspond à {@code ChantierResource.deleteChantier()} dans le serveur.
     *
     * @param id L'identifiant du chantier.
     * @param permanent Si true, suppression définitive, sinon suppression logique.
     * @return Réponse HTTP (204 No Content en cas de succès).
     */
    @DELETE
    @Path("/chantiers/{id}")
    Response deleteChantier(@PathParam("id") String id, @QueryParam("permanent") @DefaultValue("false") boolean permanent);

    /**
     * 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();

    // === ENDPOINTS EMPLOYÉS ===

    /**
     * Récupère la liste des employés.
     * Correspond à {@code EmployeResource.getAllEmployes()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des employés.
     */
    @GET
    @Path("/employes")
    Response getEmployes();

    /**
     * Récupère un employé par son identifiant.
     *
     * @param id L'identifiant de l'employé.
     * @return Réponse HTTP contenant l'employé.
     */
    @GET
    @Path("/employes/{id}")
    Response getEmploye(@PathParam("id") String id);

    // === ENDPOINTS ÉQUIPES ===

    /**
     * Récupère la liste des équipes.
     * Correspond à {@code EquipeResource.getAllEquipes()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des équipes.
     */
    @GET
    @Path("/equipes")
    Response getEquipes();

    /**
     * Récupère une équipe par son identifiant.
     *
     * @param id L'identifiant de l'équipe.
     * @return Réponse HTTP contenant l'équipe.
     */
    @GET
    @Path("/equipes/{id}")
    Response getEquipe(@PathParam("id") String id);

    // === ENDPOINTS MATÉRIELS ===

    /**
     * Récupère la liste des matériels.
     * Correspond à {@code MaterielResource.getAllMateriels()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des matériels.
     */
    @GET
    @Path("/materiels")
    Response getMateriels();

    /**
     * Récupère un matériel par son identifiant.
     *
     * @param id L'identifiant du matériel.
     * @return Réponse HTTP contenant le matériel.
     */
    @GET
    @Path("/materiels/{id}")
    Response getMateriel(@PathParam("id") String id);

    // === ENDPOINTS STOCKS ===

    /**
     * Récupère la liste des stocks.
     * Correspond à {@code StockResource.getAllStocks()} dans le serveur.
     *
     * @return Réponse HTTP contenant la liste des stocks.
     */
    @GET
    @Path("/stocks")
    Response getStocks();

    /**
     * Récupère un stock par son identifiant.
     *
     * @param id L'identifiant du stock.
     * @return Réponse HTTP contenant le stock.
     */
    @GET
    @Path("/stocks/{id}")
    Response getStock(@PathParam("id") String id);

    // === ENDPOINTS NOTIFICATIONS ===

    /**
     * Récupère les notifications non lues pour un utilisateur.
     * Correspond à {@code NotificationResource.getAllNotifications()} avec filtre nonLues=true.
     *
     * @param userId ID de l'utilisateur (UUID en String).
     * @return Réponse HTTP contenant la liste des notifications non lues.
     */
    @GET
    @Path("/notifications")
    Response getNotifications(
        @QueryParam("userId") String userId,
        @QueryParam("nonLues") @DefaultValue("true") boolean nonLues);

    // === ENDPOINTS MESSAGES ===

    /**
     * Récupère les messages non lus pour un utilisateur.
     * Correspond à {@code MessageResource.getMessagesNonLus()} dans le serveur.
     *
     * @param userId ID de l'utilisateur (UUID en String).
     * @return Réponse HTTP contenant la liste des messages non lus.
     */
    @GET
    @Path("/messages/non-lus/{userId}")
    Response getMessagesNonLus(@PathParam("userId") String userId);
}

