package dev.lions.unionflow.client.view;

import jakarta.enterprise.context.SessionScoped;
import jakarta.inject.Named;
import jakarta.annotation.PostConstruct;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal;

@Named("rapportsBean")
@SessionScoped
public class RapportsBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private String periodeRapide;
    private LocalDate dateDebut;
    private LocalDate dateFin;
    private String groupeComparaison;
    
    private IndicateursGlobaux indicateurs;
    private List<EvolutionMensuelle> evolutionMensuelle;
    private List<Objectif> objectifs;
    private List<RepartitionMembres> repartitionMembres;
    private List<SourceRevenus> sourceRevenus;
    private List<TopEntite> topEntites;
    private List<KPI> kpis;
    private List<Alerte> alertes;
    private List<HistoriqueRapport> historiqueRapports;
    
    private NouveauRapport nouveauRapport;
    private HistoriqueRapport rapportSelectionne;
    
    @PostConstruct
    public void init() {
        initializePeriodes();
        initializeIndicateurs();
        initializeEvolutionMensuelle();
        initializeObjectifs();
        initializeRepartitions();
        initializeTopEntites();
        initializeKPIs();
        initializeAlertes();
        initializeHistoriqueRapports();
        initializeNouveauRapport();
    }
    
    private void initializePeriodes() {
        periodeRapide = "30_JOURS";
        dateDebut = LocalDate.now().minusDays(30);
        dateFin = LocalDate.now();
        groupeComparaison = "PERIODE_PRECEDENTE";
    }
    
    private void initializeIndicateurs() {
        indicateurs = new IndicateursGlobaux();
        indicateurs.setTotalMembres(1247);
        indicateurs.setCroissanceMembres(8.5);
        indicateurs.setRevenus("45 750 000 FCFA");
        indicateurs.setCroissanceRevenus(12.3);
        indicateurs.setTotalEvenements(42);
        indicateurs.setCroissanceEvenements(15.7);
        indicateurs.setTotalAides("12 850 000 FCFA");
        indicateurs.setCroissanceAides(22.1);
    }
    
    private void initializeEvolutionMensuelle() {
        evolutionMensuelle = new ArrayList<>();
        String[] mois = {"Jan", "Fév", "Mar", "Avr", "Mai", "Jun"};
        int[] membres = {1150, 1180, 1205, 1225, 1240, 1247};
        double[] revenus = {3.2, 3.8, 4.1, 4.5, 3.9, 4.2};
        
        for (int i = 0; i < mois.length; i++) {
            EvolutionMensuelle evolution = new EvolutionMensuelle();
            evolution.setLibelle(mois[i]);
            evolution.setMembres(membres[i]);
            evolution.setRevenus(revenus[i]);
            evolution.setHauteurMembres((int) ((membres[i] - 1100) / 2));
            evolution.setHauteurRevenus((int) (revenus[i] * 15));
            evolutionMensuelle.add(evolution);
        }
    }
    
    private void initializeObjectifs() {
        objectifs = new ArrayList<>();
        
        Objectif obj1 = new Objectif();
        obj1.setLibelle("Nouveaux Membres");
        obj1.setRealise("247");
        obj1.setCible("300");
        obj1.setPourcentage(82);
        objectifs.add(obj1);
        
        Objectif obj2 = new Objectif();
        obj2.setLibelle("Revenus Cotisations");
        obj2.setRealise("38.5M");
        obj2.setCible("45M");
        obj2.setPourcentage(86);
        objectifs.add(obj2);
        
        Objectif obj3 = new Objectif();
        obj3.setLibelle("Événements Organisés");
        obj3.setRealise("42");
        obj3.setCible("50");
        obj3.setPourcentage(84);
        objectifs.add(obj3);
        
        Objectif obj4 = new Objectif();
        obj4.setLibelle("Aides Accordées");
        obj4.setRealise("156");
        obj4.setCible("200");
        obj4.setPourcentage(78);
        objectifs.add(obj4);
    }
    
    private void initializeRepartitions() {
        repartitionMembres = new ArrayList<>();
        
        RepartitionMembres actifs = new RepartitionMembres();
        actifs.setLibelle("Membres Actifs");
        actifs.setNombre(987);
        actifs.setPourcentage(79.2);
        actifs.setCouleur("green-500");
        repartitionMembres.add(actifs);
        
        RepartitionMembres inactifs = new RepartitionMembres();
        inactifs.setLibelle("Membres Inactifs");
        inactifs.setNombre(185);
        inactifs.setPourcentage(14.8);
        inactifs.setCouleur("orange-500");
        repartitionMembres.add(inactifs);
        
        RepartitionMembres nouveaux = new RepartitionMembres();
        nouveaux.setLibelle("Nouveaux Membres");
        nouveaux.setNombre(75);
        nouveaux.setPourcentage(6.0);
        nouveaux.setCouleur("blue-500");
        repartitionMembres.add(nouveaux);
        
        sourceRevenus = new ArrayList<>();
        
        SourceRevenus cotisations = new SourceRevenus();
        cotisations.setLibelle("Cotisations");
        cotisations.setMontant("28.5M FCFA");
        cotisations.setPourcentage(62.3);
        cotisations.setCouleur("blue-500");
        cotisations.setIcon("pi-users");
        sourceRevenus.add(cotisations);
        
        SourceRevenus evenements = new SourceRevenus();
        evenements.setLibelle("Événements");
        evenements.setMontant("12.8M FCFA");
        evenements.setPourcentage(28.0);
        evenements.setCouleur("green-500");
        evenements.setIcon("pi-calendar");
        sourceRevenus.add(evenements);
        
        SourceRevenus dons = new SourceRevenus();
        dons.setLibelle("Dons & Subventions");
        dons.setMontant("4.4M FCFA");
        dons.setPourcentage(9.7);
        dons.setCouleur("purple-500");
        dons.setIcon("pi-heart");
        sourceRevenus.add(dons);
    }
    
    private void initializeTopEntites() {
        topEntites = new ArrayList<>();
        
        String[] noms = {
            "Association Alpha Centrale", "Club Beta Régional", "Groupe Gamma Local",
            "Association Delta Nord", "Club Epsilon Sud"
        };
        
        String[] icons = {"pi-users", "pi-home", "pi-sitemap", "pi-users", "pi-home"};
        int[] scores = {95, 89, 84, 78, 72};
        String[] tendances = {"UP", "UP", "STABLE", "DOWN", "UP"};
        
        for (int i = 0; i < noms.length; i++) {
            TopEntite entite = new TopEntite();
            entite.setRang(i + 1);
            entite.setNom(noms[i]);
            entite.setTypeIcon(icons[i]);
            entite.setScore(scores[i]);
            entite.setTendance(tendances[i]);
            topEntites.add(entite);
        }
    }
    
    private void initializeKPIs() {
        kpis = new ArrayList<>();
        
        KPI participation = new KPI();
        participation.setLibelle("Taux de Participation");
        participation.setValeur("84%");
        participation.setProgression(84);
        participation.setVariation(5.2);
        participation.setTendance("UP");
        participation.setIcon("pi-users");
        participation.setCouleur("blue-500");
        kpis.add(participation);
        
        KPI satisfaction = new KPI();
        satisfaction.setLibelle("Satisfaction Membres");
        satisfaction.setValeur("92%");
        satisfaction.setProgression(92);
        satisfaction.setVariation(3.1);
        satisfaction.setTendance("UP");
        satisfaction.setIcon("pi-star");
        satisfaction.setCouleur("green-500");
        kpis.add(satisfaction);
        
        KPI retention = new KPI();
        retention.setLibelle("Taux de Rétention");
        retention.setValeur("88%");
        retention.setProgression(88);
        retention.setVariation(-1.8);
        retention.setTendance("DOWN");
        retention.setIcon("pi-refresh");
        retention.setCouleur("orange-500");
        kpis.add(retention);
        
        KPI croissance = new KPI();
        croissance.setLibelle("Croissance Mensuelle");
        croissance.setValeur("2.1%");
        croissance.setProgression(75);
        croissance.setVariation(0.8);
        croissance.setTendance("UP");
        croissance.setIcon("pi-chart-line");
        croissance.setCouleur("purple-500");
        kpis.add(croissance);
    }
    
    private void initializeAlertes() {
        alertes = new ArrayList<>();
        
        Alerte baisseCotisations = new Alerte();
        baisseCotisations.setTitre("Baisse des Cotisations");
        baisseCotisations.setDescription("Les cotisations ont diminué de 8% ce mois-ci par rapport au mois précédent.");
        baisseCotisations.setPriorite("HAUTE");
        baisseCotisations.setSeverite("warning");
        baisseCotisations.setSeveriteCouleur("orange-500");
        baisseCotisations.setIcon("pi-exclamation-triangle");
        baisseCotisations.setDateDetection("Il y a 2 jours");
        alertes.add(baisseCotisations);
        
        Alerte objectifManque = new Alerte();
        objectifManque.setTitre("Objectif Membres Non Atteint");
        objectifManque.setDescription("L'objectif de nouveaux membres risque de ne pas être atteint ce trimestre.");
        objectifManque.setPriorite("MOYENNE");
        objectifManque.setSeverite("info");
        objectifManque.setSeveriteCouleur("blue-500");
        objectifManque.setIcon("pi-info-circle");
        objectifManque.setDateDetection("Il y a 5 jours");
        alertes.add(objectifManque);
        
        Alerte budgetDepasse = new Alerte();
        budgetDepasse.setTitre("Budget Événements Dépassé");
        budgetDepasse.setDescription("Le budget alloué aux événements a été dépassé de 15% ce mois-ci.");
        budgetDepasse.setPriorite("CRITIQUE");
        budgetDepasse.setSeverite("danger");
        budgetDepasse.setSeveriteCouleur("red-500");
        budgetDepasse.setIcon("pi-exclamation-circle");
        budgetDepasse.setDateDetection("Hier");
        alertes.add(budgetDepasse);
        
        Alerte performance = new Alerte();
        performance.setTitre("Performance Excellente");
        performance.setDescription("Félicitations ! La satisfaction des membres a atteint un niveau record de 92%.");
        performance.setPriorite("INFO");
        performance.setSeverite("success");
        performance.setSeveriteCouleur("green-500");
        performance.setIcon("pi-check-circle");
        performance.setDateDetection("Il y a 1 semaine");
        alertes.add(performance);
    }
    
    private void initializeHistoriqueRapports() {
        historiqueRapports = new ArrayList<>();
        
        String[] types = {"FINANCIER", "MEMBRES", "ACTIVITES", "PERFORMANCE", "COMPLET"};
        String[] typesLibelles = {"Rapport Financier", "Rapport Membres", "Rapport Activités", "Rapport Performance", "Rapport Complet"};
        String[] typeIcons = {"pi-dollar", "pi-users", "pi-calendar", "pi-chart-bar", "pi-file"};
        String[] typeCouleurs = {"green-500", "blue-500", "orange-500", "purple-500", "indigo-500"};
        String[] generesPar = {"Marie Kouassi", "Paul Traoré", "Fatou Sanogo", "Jean Ouattara", "Aissata Koné"};
        String[] statuts = {"GENERE", "EN_COURS", "GENERE", "GENERE", "PLANIFIE"};
        
        for (int i = 0; i < 15; i++) {
            HistoriqueRapport rapport = new HistoriqueRapport();
            rapport.setId((long) (i + 1));
            rapport.setType(types[i % types.length]);
            rapport.setTypeLibelle(typesLibelles[i % typesLibelles.length]);
            rapport.setTypeIcon(typeIcons[i % typeIcons.length]);
            rapport.setTypeCouleur(typeCouleurs[i % typeCouleurs.length]);
            rapport.setDateGeneration(LocalDate.now().minusDays(i * 7 + 1));
            rapport.setPeriodeCouverte(getDescriptionPeriode(i));
            rapport.setGenerePar(generesPar[i % generesPar.length]);
            rapport.setStatut(statuts[i % statuts.length]);
            historiqueRapports.add(rapport);
        }
    }
    
    private String getDescriptionPeriode(int index) {
        return switch (index % 5) {
            case 0 -> "Dernières 4 semaines";
            case 1 -> "Trimestre en cours";
            case 2 -> "6 derniers mois";
            case 3 -> "Année en cours";
            default -> "Période personnalisée";
        };
    }
    
    private void initializeNouveauRapport() {
        nouveauRapport = new NouveauRapport();
        nouveauRapport.setFormat("PDF");
        nouveauRapport.setPeriode("30_JOURS");
        nouveauRapport.setDetail("STANDARD");
    }
    
    // Actions
    public void genererRapport() {
        System.out.println("Génération du rapport " + nouveauRapport.getType() + " en format " + nouveauRapport.getFormat());
        
        HistoriqueRapport nouveauHistorique = new HistoriqueRapport();
        nouveauHistorique.setId((long) (historiqueRapports.size() + 1));
        nouveauHistorique.setType(nouveauRapport.getType());
        nouveauHistorique.setTypeLibelle(getTypeLibelle(nouveauRapport.getType()));
        nouveauHistorique.setTypeIcon(getTypeIcon(nouveauRapport.getType()));
        nouveauHistorique.setTypeCouleur(getTypeCouleur(nouveauRapport.getType()));
        nouveauHistorique.setDateGeneration(LocalDate.now());
        nouveauHistorique.setPeriodeCouverte(getPeriodeDescription(nouveauRapport.getPeriode()));
        nouveauHistorique.setGenerePar("Utilisateur Actuel");
        nouveauHistorique.setStatut("EN_COURS");
        
        historiqueRapports.add(0, nouveauHistorique);
        initializeNouveauRapport();
    }
    
    private String getTypeLibelle(String type) {
        return switch (type) {
            case "FINANCIER" -> "Rapport Financier";
            case "MEMBRES" -> "Rapport Membres";
            case "ACTIVITES" -> "Rapport Activités";
            case "PERFORMANCE" -> "Rapport Performance";
            case "COMPLET" -> "Rapport Complet";
            default -> type;
        };
    }
    
    private String getTypeIcon(String type) {
        return switch (type) {
            case "FINANCIER" -> "pi-dollar";
            case "MEMBRES" -> "pi-users";
            case "ACTIVITES" -> "pi-calendar";
            case "PERFORMANCE" -> "pi-chart-bar";
            case "COMPLET" -> "pi-file";
            default -> "pi-file";
        };
    }
    
    private String getTypeCouleur(String type) {
        return switch (type) {
            case "FINANCIER" -> "green-500";
            case "MEMBRES" -> "blue-500";
            case "ACTIVITES" -> "orange-500";
            case "PERFORMANCE" -> "purple-500";
            case "COMPLET" -> "indigo-500";
            default -> "gray-500";
        };
    }
    
    private String getPeriodeDescription(String periode) {
        return switch (periode) {
            case "7_JOURS" -> "7 derniers jours";
            case "30_JOURS" -> "30 derniers jours";
            case "3_MOIS" -> "3 derniers mois";
            case "6_MOIS" -> "6 derniers mois";
            case "ANNEE_COURANTE" -> "Année en cours";
            case "PERSONNALISEE" -> "Période personnalisée";
            default -> periode;
        };
    }
    
    public String voirRapport(HistoriqueRapport rapport) {
        return "/pages/admin/rapports/details?id=" + rapport.getId() + "&faces-redirect=true";
    }
    
    public void telechargerRapport(HistoriqueRapport rapport) {
        System.out.println("Téléchargement du rapport: " + rapport.getTypeLibelle());
    }
    
    public void exporterDonnees() {
        System.out.println("Export des données statistiques");
    }
    
    // Getters et Setters
    public String getPeriodeRapide() { return periodeRapide; }
    public void setPeriodeRapide(String periodeRapide) { this.periodeRapide = periodeRapide; }
    
    public LocalDate getDateDebut() { return dateDebut; }
    public void setDateDebut(LocalDate dateDebut) { this.dateDebut = dateDebut; }
    
    public LocalDate getDateFin() { return dateFin; }
    public void setDateFin(LocalDate dateFin) { this.dateFin = dateFin; }
    
    public String getGroupeComparaison() { return groupeComparaison; }
    public void setGroupeComparaison(String groupeComparaison) { this.groupeComparaison = groupeComparaison; }
    
    public IndicateursGlobaux getIndicateurs() { return indicateurs; }
    public void setIndicateurs(IndicateursGlobaux indicateurs) { this.indicateurs = indicateurs; }
    
    public List<EvolutionMensuelle> getEvolutionMensuelle() { return evolutionMensuelle; }
    public void setEvolutionMensuelle(List<EvolutionMensuelle> evolutionMensuelle) { this.evolutionMensuelle = evolutionMensuelle; }
    
    public List<Objectif> getObjectifs() { return objectifs; }
    public void setObjectifs(List<Objectif> objectifs) { this.objectifs = objectifs; }
    
    public List<RepartitionMembres> getRepartitionMembres() { return repartitionMembres; }
    public void setRepartitionMembres(List<RepartitionMembres> repartitionMembres) { this.repartitionMembres = repartitionMembres; }
    
    public List<SourceRevenus> getSourceRevenus() { return sourceRevenus; }
    public void setSourceRevenus(List<SourceRevenus> sourceRevenus) { this.sourceRevenus = sourceRevenus; }
    
    public List<TopEntite> getTopEntites() { return topEntites; }
    public void setTopEntites(List<TopEntite> topEntites) { this.topEntites = topEntites; }
    
    public List<KPI> getKpis() { return kpis; }
    public void setKpis(List<KPI> kpis) { this.kpis = kpis; }
    
    public List<Alerte> getAlertes() { return alertes; }
    public void setAlertes(List<Alerte> alertes) { this.alertes = alertes; }
    
    public List<HistoriqueRapport> getHistoriqueRapports() { return historiqueRapports; }
    public void setHistoriqueRapports(List<HistoriqueRapport> historiqueRapports) { this.historiqueRapports = historiqueRapports; }
    
    public NouveauRapport getNouveauRapport() { return nouveauRapport; }
    public void setNouveauRapport(NouveauRapport nouveauRapport) { this.nouveauRapport = nouveauRapport; }
    
    public HistoriqueRapport getRapportSelectionne() { return rapportSelectionne; }
    public void setRapportSelectionne(HistoriqueRapport rapportSelectionne) { this.rapportSelectionne = rapportSelectionne; }
    
    // Classes internes
    public static class IndicateursGlobaux {
        private int totalMembres;
        private double croissanceMembres;
        private String revenus;
        private double croissanceRevenus;
        private int totalEvenements;
        private double croissanceEvenements;
        private String totalAides;
        private double croissanceAides;
        
        // Getters et setters
        public int getTotalMembres() { return totalMembres; }
        public void setTotalMembres(int totalMembres) { this.totalMembres = totalMembres; }
        
        public double getCroissanceMembres() { return croissanceMembres; }
        public void setCroissanceMembres(double croissanceMembres) { this.croissanceMembres = croissanceMembres; }
        
        public String getRevenus() { return revenus; }
        public void setRevenus(String revenus) { this.revenus = revenus; }
        
        public double getCroissanceRevenus() { return croissanceRevenus; }
        public void setCroissanceRevenus(double croissanceRevenus) { this.croissanceRevenus = croissanceRevenus; }
        
        public int getTotalEvenements() { return totalEvenements; }
        public void setTotalEvenements(int totalEvenements) { this.totalEvenements = totalEvenements; }
        
        public double getCroissanceEvenements() { return croissanceEvenements; }
        public void setCroissanceEvenements(double croissanceEvenements) { this.croissanceEvenements = croissanceEvenements; }
        
        public String getTotalAides() { return totalAides; }
        public void setTotalAides(String totalAides) { this.totalAides = totalAides; }
        
        public double getCroissanceAides() { return croissanceAides; }
        public void setCroissanceAides(double croissanceAides) { this.croissanceAides = croissanceAides; }
    }
    
    public static class EvolutionMensuelle {
        private String libelle;
        private int membres;
        private double revenus;
        private int hauteurMembres;
        private int hauteurRevenus;
        
        // Getters et setters
        public String getLibelle() { return libelle; }
        public void setLibelle(String libelle) { this.libelle = libelle; }
        
        public int getMembres() { return membres; }
        public void setMembres(int membres) { this.membres = membres; }
        
        public double getRevenus() { return revenus; }
        public void setRevenus(double revenus) { this.revenus = revenus; }
        
        public int getHauteurMembres() { return hauteurMembres; }
        public void setHauteurMembres(int hauteurMembres) { this.hauteurMembres = hauteurMembres; }
        
        public int getHauteurRevenus() { return hauteurRevenus; }
        public void setHauteurRevenus(int hauteurRevenus) { this.hauteurRevenus = hauteurRevenus; }
    }
    
    public static class Objectif {
        private String libelle;
        private String realise;
        private String cible;
        private int pourcentage;
        
        // Getters et setters
        public String getLibelle() { return libelle; }
        public void setLibelle(String libelle) { this.libelle = libelle; }
        
        public String getRealise() { return realise; }
        public void setRealise(String realise) { this.realise = realise; }
        
        public String getCible() { return cible; }
        public void setCible(String cible) { this.cible = cible; }
        
        public int getPourcentage() { return pourcentage; }
        public void setPourcentage(int pourcentage) { this.pourcentage = pourcentage; }
    }
    
    public static class RepartitionMembres {
        private String libelle;
        private int nombre;
        private double pourcentage;
        private String couleur;
        
        // Getters et setters
        public String getLibelle() { return libelle; }
        public void setLibelle(String libelle) { this.libelle = libelle; }
        
        public int getNombre() { return nombre; }
        public void setNombre(int nombre) { this.nombre = nombre; }
        
        public double getPourcentage() { return pourcentage; }
        public void setPourcentage(double pourcentage) { this.pourcentage = pourcentage; }
        
        public String getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
    }
    
    public static class SourceRevenus {
        private String libelle;
        private String montant;
        private double pourcentage;
        private String couleur;
        private String icon;
        
        // Getters et setters
        public String getLibelle() { return libelle; }
        public void setLibelle(String libelle) { this.libelle = libelle; }
        
        public String getMontant() { return montant; }
        public void setMontant(String montant) { this.montant = montant; }
        
        public double getPourcentage() { return pourcentage; }
        public void setPourcentage(double pourcentage) { this.pourcentage = pourcentage; }
        
        public String getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
        
        public String getIcon() { return icon; }
        public void setIcon(String icon) { this.icon = icon; }
    }
    
    public static class TopEntite {
        private int rang;
        private String nom;
        private String typeIcon;
        private int score;
        private String tendance;
        
        // Getters et setters
        public int getRang() { return rang; }
        public void setRang(int rang) { this.rang = rang; }
        
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public String getTypeIcon() { return typeIcon; }
        public void setTypeIcon(String typeIcon) { this.typeIcon = typeIcon; }
        
        public int getScore() { return score; }
        public void setScore(int score) { this.score = score; }
        
        public String getTendance() { return tendance; }
        public void setTendance(String tendance) { this.tendance = tendance; }
    }
    
    public static class KPI {
        private String libelle;
        private String valeur;
        private int progression;
        private double variation;
        private String tendance;
        private String icon;
        private String couleur;
        
        // Getters et setters
        public String getLibelle() { return libelle; }
        public void setLibelle(String libelle) { this.libelle = libelle; }
        
        public String getValeur() { return valeur; }
        public void setValeur(String valeur) { this.valeur = valeur; }
        
        public int getProgression() { return progression; }
        public void setProgression(int progression) { this.progression = progression; }
        
        public double getVariation() { return variation; }
        public void setVariation(double variation) { this.variation = variation; }
        
        public String getTendance() { return tendance; }
        public void setTendance(String tendance) { this.tendance = tendance; }
        
        public String getIcon() { return icon; }
        public void setIcon(String icon) { this.icon = icon; }
        
        public String getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
    }
    
    public static class Alerte {
        private String titre;
        private String description;
        private String priorite;
        private String severite;
        private String severiteCouleur;
        private String icon;
        private String dateDetection;
        
        // Getters et setters
        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public String getPriorite() { return priorite; }
        public void setPriorite(String priorite) { this.priorite = priorite; }
        
        public String getSeverite() { return severite; }
        public void setSeverite(String severite) { this.severite = severite; }
        
        public String getSeveriteCouleur() { return severiteCouleur; }
        public void setSeveriteCouleur(String severiteCouleur) { this.severiteCouleur = severiteCouleur; }
        
        public String getIcon() { return icon; }
        public void setIcon(String icon) { this.icon = icon; }
        
        public String getDateDetection() { return dateDetection; }
        public void setDateDetection(String dateDetection) { this.dateDetection = dateDetection; }
    }
    
    public static class HistoriqueRapport {
        private Long id;
        private String type;
        private String typeLibelle;
        private String typeIcon;
        private String typeCouleur;
        private LocalDate dateGeneration;
        private String periodeCouverte;
        private String generePar;
        private String statut;
        
        // Getters et setters
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
        
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getTypeLibelle() { return typeLibelle; }
        public void setTypeLibelle(String typeLibelle) { this.typeLibelle = typeLibelle; }
        
        public String getTypeIcon() { return typeIcon; }
        public void setTypeIcon(String typeIcon) { this.typeIcon = typeIcon; }
        
        public String getTypeCouleur() { return typeCouleur; }
        public void setTypeCouleur(String typeCouleur) { this.typeCouleur = typeCouleur; }
        
        public LocalDate getDateGeneration() { return dateGeneration; }
        public void setDateGeneration(LocalDate dateGeneration) { this.dateGeneration = dateGeneration; }
        
        public String getPeriodeCouverte() { return periodeCouverte; }
        public void setPeriodeCouverte(String periodeCouverte) { this.periodeCouverte = periodeCouverte; }
        
        public String getGenerePar() { return generePar; }
        public void setGenerePar(String generePar) { this.generePar = generePar; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getDateGenerationFormatee() {
            if (dateGeneration == null) return "";
            return dateGeneration.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
        }
        
        public String getStatutSeverity() {
            return switch (statut) {
                case "GENERE" -> "success";
                case "EN_COURS" -> "warning";
                case "PLANIFIE" -> "info";
                case "ERREUR" -> "danger";
                default -> "secondary";
            };
        }
    }
    
    public static class NouveauRapport {
        private String type;
        private String format;
        private String periode;
        private String detail;
        private String commentaires;
        
        // Getters et setters
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getFormat() { return format; }
        public void setFormat(String format) { this.format = format; }
        
        public String getPeriode() { return periode; }
        public void setPeriode(String periode) { this.periode = periode; }
        
        public String getDetail() { return detail; }
        public void setDetail(String detail) { this.detail = detail; }
        
        public String getCommentaires() { return commentaires; }
        public void setCommentaires(String commentaires) { this.commentaires = commentaires; }
    }
}