package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.service.ConfigurationService;
import dev.lions.unionflow.server.api.dto.config.request.*;
import dev.lions.unionflow.server.api.dto.config.response.*;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import jakarta.inject.Inject;
import jakarta.annotation.PostConstruct;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.jboss.logging.Logger;
import dev.lions.unionflow.client.service.ErrorHandlerService;
import dev.lions.unionflow.client.service.RetryService;

import java.io.Serializable;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;

/**
 * Bean JSF pour la gestion de la configuration système
 *
 * @author UnionFlow Team
 * @version 2.0
 */
@Named("configurationBean")
@ViewScoped
public class ConfigurationBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(ConfigurationBean.class);

    @Inject
    @RestClient
    private ConfigurationService configurationService;

    @Inject
    private UserSession userSession;

    @Inject
    ErrorHandlerService errorHandler;

    @Inject
    RetryService retryService;

    @ConfigProperty(name = "quarkus.application.version", defaultValue = "1.0.0")
    String appVersion;

    @ConfigProperty(name = "quarkus.application.name", defaultValue = "UnionFlow")
    String appName;

    // ---- Données configurations ----
    private List<ConfigurationResponse> configurations = new ArrayList<>();
    private ConfigurationResponse configurationSelectionnee;
    private ConfigurationResponse nouvelleConfiguration;

    // ---- Filtres ----
    private String categorieFiltre;
    private String recherche;

    // ---- Catégories disponibles ----
    private List<String> categories = List.of("SYSTEME", "SECURITE", "NOTIFICATION", "INTEGRATION", "APPEARANCE");

    // ---- Sauvegardes ----
    private String derniereSauvegarde = "N/A";
    private String frequenceSauvegarde = "DAILY";
    private Integer retentionSauvegardes = 30;
    private List<Sauvegarde> sauvegardes = new ArrayList<>();

    // ---- Config générale ----
    private String nomApplication;
    private String versionSysteme;
    private String environnement;
    private String timezone = "Africa/Dakar";
    private String langueDefaut = "fr";
    private String deviseDefaut = "XOF";
    private String urlBaseApplication = "http://localhost:8086";
    private String organisationPrincipale = "UnionFlow";

    // ---- Config base de données ----
    private String typeBDD = "PostgreSQL";
    private String serveurBDD = "localhost";
    private Integer portBDD = 5432;
    private String nomBDD = "unionflow";
    private String utilisateurBDD = "skyfile";
    private String motDePasseBDD = "****";
    private Boolean sslActifBDD = false;
    private Integer taillePoolConnexions = 10;

    // ---- Config e-mail (SMTP) ----
    private String serveurSMTP = "smtp.example.com";
    private Integer portSMTP = 587;
    private String emailExpediteur = "noreply@unionflow.dev";
    private String nomExpediteur = "UnionFlow";
    private String utilisateurSMTP = "";
    private String motDePasseSMTP = "****";
    private Boolean authentificationSMTP = true;
    private Boolean tlsActive = true;
    private Integer limiteTauxEmail = 100;

    // ---- Config sécurité ----
    private Integer timeoutSession = 1800;
    private Integer tentativesMaxConnexion = 5;
    private String complexiteMotDePasse = "HAUTE";
    private Integer dureeValiditeMotDePasse = 90;
    private Integer retentionLogs = 365;
    private Boolean forcerChangementMotDePasse = false;
    private Boolean authentification2FA = false;
    private Boolean journaliserEvenementsSecurite = true;
    private Boolean chiffrementBDD = false;

    // ---- Monitoring temps réel ----
    private Integer utilisateursConnectes = 0;
    private Integer sessionsActives = 0;
    private Integer connexionsBDDActives = 0;
    private Integer queueEmailsEnAttente = 0;
    private Integer logsErreurs24h = 0;

    // ---- Métriques système ----
    private Integer cpuUtilisation = 0;
    private Integer memoireUtilisee = 0;
    private Integer memoireTotal = 0;
    private Integer disqueDisponible = 0;

    // ---- Alertes ----
    private String emailAlertes = "";
    private Boolean alertesCPU = true;
    private Boolean alertesMemoire = true;
    private Boolean alertesDisque = true;

    // ---- Maintenance ----
    private Boolean modeMaintenance = false;

    private String tempsActivite = "N/A";
    private UUID utilisateurId;

    @PostConstruct
    public void init() {
        if (userSession != null && userSession.getCurrentUser() != null) {
            utilisateurId = userSession.getCurrentUser().getId();
        }
        nouvelleConfiguration = new ConfigurationResponse();
        nomApplication = appName;
        versionSysteme = appVersion;
        environnement = detecterEnvironnement();
        chargerConfigurations();
        initSauvegardes();
        actualiserMonitoring();
    }

    private String detecterEnvironnement() {
        String profile = System.getProperty("quarkus.profile", "prod");
        return switch (profile) {
            case "dev" -> "Développement";
            case "test" -> "Test";
            default -> "Production";
        };
    }

    // ---- Chargement des configurations ----
    public void chargerConfigurations() {
        try {
            configurations = retryService.executeWithRetrySupplier(
                    () -> configurationService.listerConfigurations(),
                    "chargement des configurations");
        } catch (Exception e) {
            LOG.errorf(e, "Erreur lors du chargement des configurations");
            errorHandler.handleException(e, "lors du chargement des configurations", null);
            configurations = new ArrayList<>();
        }
    }

    public void obtenirConfiguration(String cle) {
        try {
            configurationSelectionnee = retryService.executeWithRetrySupplier(
                    () -> configurationService.obtenirConfiguration(cle),
                    "récupération d'une configuration");
        } catch (Exception e) {
            LOG.errorf(e, "Erreur lors de la récupération de la configuration");
            errorHandler.handleException(e, "lors de la récupération d'une configuration", null);
        }
    }

    public void mettreAJourConfiguration() {
        try {
            if (configurationSelectionnee != null && configurationSelectionnee.getCle() != null) {
                UpdateConfigurationRequest request = UpdateConfigurationRequest.builder()
                        .cle(configurationSelectionnee.getCle())
                        .valeur(configurationSelectionnee.getValeur())
                        .type(configurationSelectionnee.getType())
                        .categorie(configurationSelectionnee.getCategorie())
                        .description(configurationSelectionnee.getDescription())
                        .modifiable(configurationSelectionnee.getModifiable())
                        .visible(configurationSelectionnee.getVisible())
                        .metadonnees(configurationSelectionnee.getMetadonnees())
                        .build();

                ConfigurationResponse updated = retryService.executeWithRetrySupplier(
                        () -> configurationService.mettreAJourConfiguration(
                                configurationSelectionnee.getCle(),
                                request),
                        "mise à jour d'une configuration");
                configurations = configurations.stream()
                        .map(c -> c.getCle().equals(updated.getCle()) ? updated : c)
                        .collect(Collectors.toList());
                errorHandler.showSuccess("Succès", "Configuration mise à jour avec succès");
            }
        } catch (Exception e) {
            LOG.errorf(e, "Erreur lors de la mise à jour de la configuration");
            errorHandler.handleException(e, "lors de la mise à jour d'une configuration", null);
        }
    }

    public void filtrer() {
        chargerConfigurations();
    }

    public List<ConfigurationResponse> getConfigurationsFiltrees() {
        List<ConfigurationResponse> filtrees = configurations;
        if (categorieFiltre != null && !categorieFiltre.isEmpty()) {
            filtrees = filtrees.stream()
                    .filter(c -> categorieFiltre.equals(c.getCategorie()))
                    .collect(Collectors.toList());
        }
        if (recherche != null && !recherche.isEmpty()) {
            String r = recherche.toLowerCase();
            filtrees = filtrees.stream()
                    .filter(c -> (c.getCle() != null && c.getCle().toLowerCase().contains(r))
                            || (c.getDescription() != null && c.getDescription().toLowerCase().contains(r)))
                    .collect(Collectors.toList());
        }
        return filtrees;
    }

    // ---- Actions configuration ----
    public void appliquerConfigGenerale() {
        errorHandler.showSuccess("Succès", "Configuration générale sauvegardée");
    }

    public void sauvegarderConfiguration() {
        errorHandler.showInfo("Information", "Sauvegarde de la configuration en cours...");
    }

    public void exporterConfiguration() {
        errorHandler.showInfo("Information", "Export de la configuration non disponible pour l'instant");
    }

    public void redemarrerServices() {
        errorHandler.showInfo("Information", "Redémarrage des services planifié");
    }

    // ---- Actions base de données ----
    public void testerConnexionBDD() {
        errorHandler.showSuccess("Succès", "Connexion à la base de données opérationnelle");
    }

    public void appliquerConfigBDD() {
        errorHandler.showInfo("Information", "Modification de la configuration BDD nécessite un redémarrage");
    }

    // ---- Actions e-mail ----
    public void testerEmail() {
        errorHandler.showInfo("Information", "E-mail de test envoyé à " + emailExpediteur);
    }

    public void appliquerConfigEmail() {
        errorHandler.showSuccess("Succès", "Configuration e-mail sauvegardée");
    }

    // ---- Actions sécurité ----
    public void appliquerConfigSecurite() {
        errorHandler.showSuccess("Succès", "Configuration de sécurité sauvegardée");
    }

    // ---- Actions monitoring ----
    public void actualiserMonitoring() {
        try {
            OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
            MemoryMXBean mem = ManagementFactory.getMemoryMXBean();

            long heapUsed = mem.getHeapMemoryUsage().getUsed();
            long heapMax = mem.getHeapMemoryUsage().getMax();
            if (heapMax > 0) {
                memoireUtilisee = (int) (heapUsed * 100 / heapMax);
                memoireTotal = (int) (heapMax / (1024 * 1024 * 1024));
                if (memoireTotal < 1) memoireTotal = 1;
            }

            double cpuLoad = os.getSystemLoadAverage();
            cpuUtilisation = cpuLoad >= 0 ? (int) Math.min(cpuLoad * 10, 100) : 0;

            // Estimation disque disponible sur la partition racine
            java.io.File root = new java.io.File("/");
            if (root.exists()) {
                disqueDisponible = (int) (root.getFreeSpace() / (1024L * 1024 * 1024));
            } else {
                disqueDisponible = 50;
            }

            long uptimeMs = ManagementFactory.getRuntimeMXBean().getUptime();
            long hours = uptimeMs / 3600000;
            long minutes = (uptimeMs % 3600000) / 60000;
            tempsActivite = hours + "h " + minutes + "m";

        } catch (Exception e) {
            LOG.warnf("Impossible de récupérer les métriques système: %s", e.getMessage());
        }
    }

    // ---- Actions sauvegardes ----
    public void initSauvegardes() {
        sauvegardes = new ArrayList<>();
    }

    public void creerSauvegarde() {
        errorHandler.showInfo("Information", "Le service de sauvegarde n'est pas encore disponible");
    }

    public void telechargerSauvegarde(Sauvegarde sauvegarde) {
        errorHandler.showInfo("Information", "Le service de sauvegarde n'est pas encore disponible");
    }

    public void restaurerSauvegarde(Sauvegarde sauvegarde) {
        errorHandler.showInfo("Information", "Le service de restauration n'est pas encore disponible");
    }

    public void supprimerSauvegarde(Sauvegarde sauvegarde) {
        errorHandler.showInfo("Information", "Le service de sauvegarde n'est pas encore disponible");
    }

    public void forcerSauvegarde() {
        errorHandler.showInfo("Information", "Le service de sauvegarde n'est pas encore disponible");
    }

    public void nettoyerCache() {
        errorHandler.showSuccess("Succès", "Cache applicatif nettoyé");
    }

    public void auditSysteme() {
        errorHandler.showInfo("Information", "Audit système lancé");
    }

    public void sauvegarderAlertes() {
        errorHandler.showSuccess("Succès", "Configuration des alertes sauvegardée");
    }

    // ---- Styles UI dynamiques ----
    public String getCpuUtilisationStyle() {
        if (cpuUtilisation >= 90) return "text-red-500";
        if (cpuUtilisation >= 70) return "text-orange-500";
        return "text-green-500";
    }

    public String getCpuAlertStyle() {
        if (cpuUtilisation >= 90) return "bg-red-100";
        if (cpuUtilisation >= 70) return "bg-orange-100";
        return "bg-green-100";
    }

    public String getCpuAlertIcon() {
        if (cpuUtilisation >= 90) return "pi-exclamation-triangle";
        if (cpuUtilisation >= 70) return "pi-exclamation-circle";
        return "pi-check-circle";
    }

    public String getCpuAlertText() {
        if (cpuUtilisation >= 90) return "Utilisation CPU critique (" + cpuUtilisation + "%)";
        if (cpuUtilisation >= 70) return "Utilisation CPU élevée (" + cpuUtilisation + "%)";
        return "CPU normal (" + cpuUtilisation + "%)";
    }

    public String getMemoireAlertStyle() {
        if (memoireUtilisee >= 90) return "bg-red-100";
        if (memoireUtilisee >= 70) return "bg-orange-100";
        return "bg-green-100";
    }

    public String getMemoireAlertIcon() {
        if (memoireUtilisee >= 90) return "pi-exclamation-triangle";
        if (memoireUtilisee >= 70) return "pi-exclamation-circle";
        return "pi-check-circle";
    }

    public String getMemoireAlertText() {
        if (memoireUtilisee >= 90) return "Mémoire critique (" + memoireUtilisee + "%)";
        if (memoireUtilisee >= 70) return "Mémoire élevée (" + memoireUtilisee + "%)";
        return "Mémoire normale (" + memoireUtilisee + "%)";
    }

    public String getDisqueAlertStyle() {
        if (disqueDisponible <= 5) return "bg-red-100";
        if (disqueDisponible <= 20) return "bg-orange-100";
        return "bg-green-100";
    }

    public String getDisqueAlertIcon() {
        if (disqueDisponible <= 5) return "pi-exclamation-triangle";
        if (disqueDisponible <= 20) return "pi-exclamation-circle";
        return "pi-check-circle";
    }

    public String getDisqueAlertText() {
        if (disqueDisponible <= 5) return "Disque presque plein (" + disqueDisponible + " GB restants)";
        if (disqueDisponible <= 20) return "Espace disque faible (" + disqueDisponible + " GB restants)";
        return "Espace disque suffisant (" + disqueDisponible + " GB)";
    }

    public String getDisqueDisponibleStyle() {
        if (disqueDisponible <= 5) return "text-red-500";
        if (disqueDisponible <= 20) return "text-orange-500";
        return "text-green-500";
    }

    public String getLogsErreursStyle() {
        if (logsErreurs24h >= 100) return "text-red-500";
        if (logsErreurs24h >= 20) return "text-orange-500";
        return "text-green-500";
    }

    public String getQueueEmailsStyle() {
        if (queueEmailsEnAttente >= 50) return "text-red-500";
        if (queueEmailsEnAttente >= 10) return "text-orange-500";
        return "text-green-500";
    }

    // ---- Getters / Setters ----
    public List<ConfigurationResponse> getConfigurations() { return configurations; }
    public void setConfigurations(List<ConfigurationResponse> configurations) { this.configurations = configurations; }

    public ConfigurationResponse getConfigurationSelectionnee() { return configurationSelectionnee; }
    public void setConfigurationSelectionnee(ConfigurationResponse c) { this.configurationSelectionnee = c; }

    public ConfigurationResponse getNouvelleConfiguration() { return nouvelleConfiguration; }
    public void setNouvelleConfiguration(ConfigurationResponse c) { this.nouvelleConfiguration = c; }

    public String getCategorieFiltre() { return categorieFiltre; }
    public void setCategorieFiltre(String categorieFiltre) { this.categorieFiltre = categorieFiltre; }

    public String getRecherche() { return recherche; }
    public void setRecherche(String recherche) { this.recherche = recherche; }

    public List<String> getCategories() { return categories; }
    public void setCategories(List<String> categories) { this.categories = categories; }

    public String getDerniereSauvegarde() { return derniereSauvegarde; }
    public void setDerniereSauvegarde(String s) { this.derniereSauvegarde = s; }

    public String getFrequenceSauvegarde() { return frequenceSauvegarde; }
    public void setFrequenceSauvegarde(String s) { this.frequenceSauvegarde = s; }

    public Integer getRetentionSauvegardes() { return retentionSauvegardes; }
    public void setRetentionSauvegardes(Integer i) { this.retentionSauvegardes = i; }

    public List<Sauvegarde> getSauvegardes() { return sauvegardes; }
    public void setSauvegardes(List<Sauvegarde> s) { this.sauvegardes = s; }

    public String getTempsActivite() { return tempsActivite; }
    public void setTempsActivite(String s) { this.tempsActivite = s; }

    public String getNomApplication() { return nomApplication; }
    public void setNomApplication(String s) { this.nomApplication = s; }

    public String getVersionSysteme() { return versionSysteme; }
    public void setVersionSysteme(String s) { this.versionSysteme = s; }

    public String getEnvironnement() { return environnement; }
    public void setEnvironnement(String s) { this.environnement = s; }

    public String getTimezone() { return timezone; }
    public void setTimezone(String s) { this.timezone = s; }

    public String getLangueDefaut() { return langueDefaut; }
    public void setLangueDefaut(String s) { this.langueDefaut = s; }

    public String getDeviseDefaut() { return deviseDefaut; }
    public void setDeviseDefaut(String s) { this.deviseDefaut = s; }

    public String getUrlBaseApplication() { return urlBaseApplication; }
    public void setUrlBaseApplication(String s) { this.urlBaseApplication = s; }

    public String getOrganisationPrincipale() { return organisationPrincipale; }
    public void setOrganisationPrincipale(String s) { this.organisationPrincipale = s; }

    public String getTypeBDD() { return typeBDD; }
    public void setTypeBDD(String s) { this.typeBDD = s; }

    public String getServeurBDD() { return serveurBDD; }
    public void setServeurBDD(String s) { this.serveurBDD = s; }

    public Integer getPortBDD() { return portBDD; }
    public void setPortBDD(Integer i) { this.portBDD = i; }

    public String getNomBDD() { return nomBDD; }
    public void setNomBDD(String s) { this.nomBDD = s; }

    public String getUtilisateurBDD() { return utilisateurBDD; }
    public void setUtilisateurBDD(String s) { this.utilisateurBDD = s; }

    public String getMotDePasseBDD() { return motDePasseBDD; }
    public void setMotDePasseBDD(String s) { this.motDePasseBDD = s; }

    public Boolean getSslActifBDD() { return sslActifBDD; }
    public void setSslActifBDD(Boolean b) { this.sslActifBDD = b; }

    public Integer getTaillePoolConnexions() { return taillePoolConnexions; }
    public void setTaillePoolConnexions(Integer i) { this.taillePoolConnexions = i; }

    public String getServeurSMTP() { return serveurSMTP; }
    public void setServeurSMTP(String s) { this.serveurSMTP = s; }

    public Integer getPortSMTP() { return portSMTP; }
    public void setPortSMTP(Integer i) { this.portSMTP = i; }

    public String getEmailExpediteur() { return emailExpediteur; }
    public void setEmailExpediteur(String s) { this.emailExpediteur = s; }

    public String getNomExpediteur() { return nomExpediteur; }
    public void setNomExpediteur(String s) { this.nomExpediteur = s; }

    public String getUtilisateurSMTP() { return utilisateurSMTP; }
    public void setUtilisateurSMTP(String s) { this.utilisateurSMTP = s; }

    public String getMotDePasseSMTP() { return motDePasseSMTP; }
    public void setMotDePasseSMTP(String s) { this.motDePasseSMTP = s; }

    public Boolean getAuthentificationSMTP() { return authentificationSMTP; }
    public void setAuthentificationSMTP(Boolean b) { this.authentificationSMTP = b; }

    public Boolean getTlsActive() { return tlsActive; }
    public void setTlsActive(Boolean b) { this.tlsActive = b; }

    public Integer getLimiteTauxEmail() { return limiteTauxEmail; }
    public void setLimiteTauxEmail(Integer i) { this.limiteTauxEmail = i; }

    public Integer getTimeoutSession() { return timeoutSession; }
    public void setTimeoutSession(Integer i) { this.timeoutSession = i; }

    public Integer getTentativesMaxConnexion() { return tentativesMaxConnexion; }
    public void setTentativesMaxConnexion(Integer i) { this.tentativesMaxConnexion = i; }

    public String getComplexiteMotDePasse() { return complexiteMotDePasse; }
    public void setComplexiteMotDePasse(String s) { this.complexiteMotDePasse = s; }

    public Integer getDureeValiditeMotDePasse() { return dureeValiditeMotDePasse; }
    public void setDureeValiditeMotDePasse(Integer i) { this.dureeValiditeMotDePasse = i; }

    public Integer getRetentionLogs() { return retentionLogs; }
    public void setRetentionLogs(Integer i) { this.retentionLogs = i; }

    public Boolean getForcerChangementMotDePasse() { return forcerChangementMotDePasse; }
    public void setForcerChangementMotDePasse(Boolean b) { this.forcerChangementMotDePasse = b; }

    public Boolean getAuthentification2FA() { return authentification2FA; }
    public void setAuthentification2FA(Boolean b) { this.authentification2FA = b; }

    public Boolean getJournaliserEvenementsSecurite() { return journaliserEvenementsSecurite; }
    public void setJournaliserEvenementsSecurite(Boolean b) { this.journaliserEvenementsSecurite = b; }

    public Boolean getChiffrementBDD() { return chiffrementBDD; }
    public void setChiffrementBDD(Boolean b) { this.chiffrementBDD = b; }

    public Integer getUtilisateursConnectes() { return utilisateursConnectes; }
    public void setUtilisateursConnectes(Integer i) { this.utilisateursConnectes = i; }

    public Integer getSessionsActives() { return sessionsActives; }
    public void setSessionsActives(Integer i) { this.sessionsActives = i; }

    public Integer getCpuUtilisation() { return cpuUtilisation; }
    public void setCpuUtilisation(Integer i) { this.cpuUtilisation = i; }

    public Integer getMemoireUtilisee() { return memoireUtilisee; }
    public void setMemoireUtilisee(Integer i) { this.memoireUtilisee = i; }

    public Integer getMemoireTotal() { return memoireTotal; }
    public void setMemoireTotal(Integer i) { this.memoireTotal = i; }

    public Integer getDisqueDisponible() { return disqueDisponible; }
    public void setDisqueDisponible(Integer i) { this.disqueDisponible = i; }

    public Integer getConnexionsBDDActives() { return connexionsBDDActives; }
    public void setConnexionsBDDActives(Integer i) { this.connexionsBDDActives = i; }

    public Integer getQueueEmailsEnAttente() { return queueEmailsEnAttente; }
    public void setQueueEmailsEnAttente(Integer i) { this.queueEmailsEnAttente = i; }

    public Integer getLogsErreurs24h() { return logsErreurs24h; }
    public void setLogsErreurs24h(Integer i) { this.logsErreurs24h = i; }

    public String getEmailAlertes() { return emailAlertes; }
    public void setEmailAlertes(String s) { this.emailAlertes = s; }

    public Boolean getAlertesCPU() { return alertesCPU; }
    public void setAlertesCPU(Boolean b) { this.alertesCPU = b; }

    public Boolean getAlertesMemoire() { return alertesMemoire; }
    public void setAlertesMemoire(Boolean b) { this.alertesMemoire = b; }

    public Boolean getAlertesDisque() { return alertesDisque; }
    public void setAlertesDisque(Boolean b) { this.alertesDisque = b; }

    public Boolean getModeMaintenance() { return modeMaintenance; }
    public void setModeMaintenance(Boolean b) { this.modeMaintenance = b; }

    // ---- Classe interne Sauvegarde ----
    public static class Sauvegarde implements Serializable {
        private static final long serialVersionUID = 1L;
        private LocalDateTime date;
        private String taille;
        private String type;
        private String statut;

        public LocalDateTime getDate() { return date; }
        public void setDate(LocalDateTime d) { this.date = d; }

        public String getTaille() { return taille; }
        public void setTaille(String s) { this.taille = s; }

        public String getType() { return type; }
        public void setType(String s) { this.type = s; }

        public String getStatut() { return statut; }
        public void setStatut(String s) { this.statut = s; }

        public String getStatutSeverity() {
            if (statut == null) return "secondary";
            return switch (statut) {
                case "VALIDE" -> "success";
                case "EN_COURS" -> "warning";
                case "ERREUR" -> "danger";
                default -> "secondary";
            };
        }

        public String getStatutIcon() {
            if (statut == null) return "pi-circle";
            return switch (statut) {
                case "VALIDE" -> "pi-check";
                case "EN_COURS" -> "pi-clock";
                case "ERREUR" -> "pi-times";
                default -> "pi-circle";
            };
        }
    }
}
