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.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Named("entitesGestionBean")
@SessionScoped
public class EntitesGestionBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private List<Entite> toutesLesEntites;
    private List<Entite> entitesFiltrees;
    private List<Entite> entitesSelectionnees;
    private Entite entiteSelectionne;
    private Entite nouvelleEntite;
    private Filtres filtres;
    private Statistiques statistiques;
    
    @PostConstruct
    public void init() {
        initializeFiltres();
        initializeEntites();
        initializeStatistiques();
        initializeNouvelleEntite();
        appliquerFiltres();
    }
    
    private void initializeFiltres() {
        filtres = new Filtres();
        entitesSelectionnees = new ArrayList<>();
    }
    
    private void initializeStatistiques() {
        statistiques = new Statistiques();
        statistiques.setTotalEntites(127); // Nouvelle stratégie volume
        statistiques.setEntitesActives(127);
        statistiques.setTotalMembres(18547); // 146 membres/organisation en moyenne
        statistiques.setMoyenneMembresParEntite(146); // Moyenne calculée
        statistiques.setRevenus("363 000 FCFA");
        statistiques.setSouscriptionsExpirantes(12);
        statistiques.setEntitesQuotaAtteint(8);
        statistiques.setFormulairePopulaire("Standard");
        statistiques.setTauxRenouvellement(94.2f);
        
        // Calcul dynamique des statistiques de souscription
        calculerStatistiquesSouscriptions();
    }
    
    private void initializeEntites() {
        toutesLesEntites = new ArrayList<>();
        
        // Génération de données de test
        String[] noms = {
            "Association Alpha Centrale", "Club Beta Régional", "Groupe Gamma Local", 
            "Association Delta Nord", "Club Epsilon Sud", "Groupe Zeta Jeunes",
            "Association Eta Ouest", "Club Theta Est", "Groupe Iota Centre",
            "Association Kappa Métropole", "Branche Féminine Lambda", "Club Mu Urbain",
            "Groupe Jeunes Nu", "Association Xi Rural", "Club Omicron Mixte"
        };
        
        String[] types = {
            "ASSOCIATION", "CLUB", "GROUPE", "ASSOCIATION", "CLUB", "GROUPE_JEUNES",
            "ASSOCIATION", "CLUB", "GROUPE", "ASSOCIATION", "BRANCHE", "CLUB",
            "GROUPE_JEUNES", "ASSOCIATION", "CLUB"
        };
        
        String[] regions = {
            "REGION_1", "REGION_2", "REGION_3", "REGION_4", "REGION_5", "REGION_1",
            "REGION_6", "REGION_7", "REGION_8", "REGION_9", "REGION_1", "REGION_10",
            "REGION_2", "REGION_11", "REGION_12"
        };
        
        String[] statuts = {
            "ACTIVE", "ACTIVE", "ACTIVE", "ACTIVE", "ACTIVE", "ACTIVE",
            "ACTIVE", "SUSPENDUE", "ACTIVE", "ACTIVE", "ACTIVE", "INACTIVE",
            "ACTIVE", "ACTIVE", "ACTIVE"
        };
        
        int[] nombresMembres = {156, 123, 98, 87, 73, 45, 67, 0, 54, 43, 32, 0, 28, 38, 51};
        
        for (int i = 0; i < noms.length; i++) {
            Entite entite = new Entite();
            entite.setId((long) (i + 1));
            entite.setNom(noms[i]);
            entite.setCodeEntite("ENT" + String.format("%03d", i + 1));
            entite.setType(types[i]);
            entite.setRegion(regions[i]);
            entite.setStatut(statuts[i]);
            entite.setNombreMembres(nombresMembres[i]);
            entite.setMembresUtilises(nombresMembres[i]);
            entite.setAdresse("Adresse " + noms[i]);
            entite.setTelephone("77 123 45 " + String.format("%02d", i + 1));
            entite.setEmail(noms[i].toLowerCase().replace(" ", ".") + "@unionflow.app");
            entite.setDescription("Description de " + noms[i]);
            entite.setDerniereActivite(LocalDateTime.now().minusDays(i * 2 + 1));
            
            // Définir le forfait selon le nombre de membres
            if (nombresMembres[i] <= 100) {
                entite.setForfaitSouscrit("Starter");
                entite.setMembresQuota(100);
                entite.setMontantMensuel("2 000 FCFA");
            } else if (nombresMembres[i] <= 200) {
                entite.setForfaitSouscrit("Standard");
                entite.setMembresQuota(200);
                entite.setMontantMensuel("3 000 FCFA");
            } else if (nombresMembres[i] <= 500) {
                entite.setForfaitSouscrit("Premium");
                entite.setMembresQuota(500);
                entite.setMontantMensuel("4 000 FCFA");
            } else {
                entite.setForfaitSouscrit("Cristal");
                entite.setMembresQuota(2000);
                entite.setMontantMensuel("5 000 FCFA");
            }
            
            // Date d'expiration (varie entre 1 mois et 11 mois)
            entite.setDateExpirationSouscription(LocalDate.now().plusMonths(1 + (i % 11)));
            
            // Administrateur
            if (nombresMembres[i] > 0) {
                Administrateur admin = new Administrateur();
                admin.setNomComplet("Admin " + (i + 1));
                admin.setEmail("admin" + (i + 1) + "@unionflow.app");
                entite.setAdministrateur(admin);
            }
            
            toutesLesEntites.add(entite);
        }
    }
    
    private void initializeNouvelleEntite() {
        nouvelleEntite = new Entite();
    }
    
    private void appliquerFiltres() {
        entitesFiltrees = toutesLesEntites.stream()
                .filter(this::appliquerFiltre)
                .collect(Collectors.toList());
    }
    
    private boolean appliquerFiltre(Entite entite) {
        // Filtre par nom
        if (filtres.getNom() != null && !filtres.getNom().trim().isEmpty()) {
            if (!entite.getNom().toLowerCase().contains(filtres.getNom().toLowerCase())) {
                return false;
            }
        }
        
        // Filtre par type
        if (filtres.getType() != null && !filtres.getType().trim().isEmpty()) {
            if (!entite.getType().equals(filtres.getType())) {
                return false;
            }
        }
        
        // Filtre par statut
        if (filtres.getStatut() != null && !filtres.getStatut().trim().isEmpty()) {
            if (!entite.getStatut().equals(filtres.getStatut())) {
                return false;
            }
        }
        
        // Filtre par région
        if (filtres.getRegion() != null && !filtres.getRegion().trim().isEmpty()) {
            if (!entite.getRegion().equals(filtres.getRegion())) {
                return false;
            }
        }
        
        // Filtre par forfait
        if (filtres.getForfait() != null && !filtres.getForfait().trim().isEmpty()) {
            if (!entite.getForfaitSouscrit().equals(filtres.getForfait())) {
                return false;
            }
        }
        
        // Filtre par alerte quota
        if (filtres.getAlerteQuota() != null && !filtres.getAlerteQuota().trim().isEmpty()) {
            if ("OUI".equals(filtres.getAlerteQuota()) && !entite.isQuotaProche()) {
                return false;
            }
            if ("NON".equals(filtres.getAlerteQuota()) && entite.isQuotaProche()) {
                return false;
            }
        }
        
        // Filtre par alerte expiration
        if (filtres.getAlerteExpiration() != null && !filtres.getAlerteExpiration().trim().isEmpty()) {
            if ("OUI".equals(filtres.getAlerteExpiration()) && !entite.isExpirationProche()) {
                return false;
            }
            if ("NON".equals(filtres.getAlerteExpiration()) && entite.isExpirationProche()) {
                return false;
            }
        }
        
        // Filtre par statut souscription
        if (filtres.getStatutSouscription() != null && !filtres.getStatutSouscription().trim().isEmpty()) {
            if (!entite.getStatutSouscription().equals(filtres.getStatutSouscription())) {
                return false;
            }
        }
        
        return true;
    }
    
    // Actions
    public void rechercher() {
        appliquerFiltres();
    }
    
    public void reinitialiserFiltres() {
        filtres = new Filtres();
        appliquerFiltres();
    }
    
    public String voirEntite(Entite entite) {
        return "/pages/super-admin/entites/details?id=" + entite.getId() + "&faces-redirect=true";
    }
    
    public void creerEntite() {
        nouvelleEntite.setId((long) (toutesLesEntites.size() + 1));
        nouvelleEntite.setCodeEntite("ENT" + String.format("%03d", toutesLesEntites.size() + 1));
        nouvelleEntite.setStatut("ACTIVE");
        nouvelleEntite.setNombreMembres(0);
        nouvelleEntite.setDerniereActivite(LocalDateTime.now());
        
        toutesLesEntites.add(nouvelleEntite);
        appliquerFiltres();
        
        System.out.println("Nouvelle entité créée: " + nouvelleEntite.getNom());
        
        initializeNouvelleEntite();
    }
    
    public String gererMembres() {
        return "/pages/admin/membres/gestion?entiteId=" + entiteSelectionne.getId() + "&faces-redirect=true";
    }
    
    public String configurerEntite() {
        return "/pages/super-admin/entites/configuration?id=" + entiteSelectionne.getId() + "&faces-redirect=true";
    }
    
    public String voirRapports() {
        return "/pages/super-admin/entites/rapports?id=" + entiteSelectionne.getId() + "&faces-redirect=true";
    }
    
    public void suspendreEntite() {
        entiteSelectionne.setStatut("SUSPENDUE");
        System.out.println("Entité suspendue: " + entiteSelectionne.getNom());
        appliquerFiltres();
    }
    
    public void reactiverEntite() {
        entiteSelectionne.setStatut("ACTIVE");
        System.out.println("Entité réactivée: " + entiteSelectionne.getNom());
        appliquerFiltres();
    }
    
    public void supprimerEntite() {
        toutesLesEntites.remove(entiteSelectionne);
        System.out.println("Entité supprimée: " + entiteSelectionne.getNom());
        appliquerFiltres();
    }
    
    public void exporterEntites() {
        System.out.println("Export de " + entitesFiltrees.size() + " entités");
    }
    
    // Getters et Setters
    public List<Entite> getToutesLesEntites() { return toutesLesEntites; }
    public void setToutesLesEntites(List<Entite> toutesLesEntites) { this.toutesLesEntites = toutesLesEntites; }
    
    public List<Entite> getEntitesFiltrees() { return entitesFiltrees; }
    public void setEntitesFiltrees(List<Entite> entitesFiltrees) { this.entitesFiltrees = entitesFiltrees; }
    
    public List<Entite> getEntitesSelectionnees() { return entitesSelectionnees; }
    public void setEntitesSelectionnees(List<Entite> entitesSelectionnees) { this.entitesSelectionnees = entitesSelectionnees; }
    
    public Entite getEntiteSelectionne() { return entiteSelectionne; }
    public void setEntiteSelectionne(Entite entiteSelectionne) { this.entiteSelectionne = entiteSelectionne; }
    
    public Entite getNouvelleEntite() { return nouvelleEntite; }
    public void setNouvelleEntite(Entite nouvelleEntite) { this.nouvelleEntite = nouvelleEntite; }
    
    public Filtres getFiltres() { return filtres; }
    public void setFiltres(Filtres filtres) { this.filtres = filtres; }
    
    public Statistiques getStatistiques() { return statistiques; }
    public void setStatistiques(Statistiques statistiques) { this.statistiques = statistiques; }
    
    // Méthodes utilitaires pour les souscriptions
    private void calculerStatistiquesSouscriptions() {
        if (toutesLesEntites == null || statistiques == null) {
            return; // Sécurité si appelé avant initialisation complète
        }
        
        int expirantes = 0;
        int quotaAtteint = 0;
        
        for (Entite entite : toutesLesEntites) {
            if (entite.isExpirationProche()) {
                expirantes++;
            }
            if (entite.isQuotaAtteint()) {
                quotaAtteint++;
            }
        }
        
        statistiques.setSouscriptionsExpirantes(expirantes);
        statistiques.setEntitesQuotaAtteint(quotaAtteint);
    }
    
    public void renouvelerSouscription() {
        if (entiteSelectionne != null) {
            entiteSelectionne.setDateExpirationSouscription(LocalDate.now().plusMonths(12));
            entiteSelectionne.setStatutSouscription("ACTIVE");
            System.out.println("Souscription renouvelée pour: " + entiteSelectionne.getNom());
            appliquerFiltres();
        }
    }
    
    public void upgraderForfait() {
        if (entiteSelectionne != null) {
            String forfaitActuel = entiteSelectionne.getForfaitSouscrit();
            switch (forfaitActuel) {
                case "Starter":
                    entiteSelectionne.setForfaitSouscrit("Standard");
                    entiteSelectionne.setMembresQuota(200);
                    entiteSelectionne.setMontantMensuel("3 000 FCFA");
                    break;
                case "Standard":
                    entiteSelectionne.setForfaitSouscrit("Premium");
                    entiteSelectionne.setMembresQuota(500);
                    entiteSelectionne.setMontantMensuel("4 000 FCFA");
                    break;
                case "Premium":
                    entiteSelectionne.setForfaitSouscrit("Cristal");
                    entiteSelectionne.setMembresQuota(2000);
                    entiteSelectionne.setMontantMensuel("5 000 FCFA");
                    break;
            }
            System.out.println("Forfait upgradé pour: " + entiteSelectionne.getNom());
            appliquerFiltres();
        }
    }
    
    public void gererQuotas() {
        System.out.println("Gestion des quotas pour toutes les entités");
    }
    
    public void envoyerRelancesSouscriptions() {
        int compteur = 0;
        for (Entite entite : toutesLesEntites) {
            if (entite.isExpirationProche()) {
                System.out.println("Relance envoyée à: " + entite.getNom());
                compteur++;
            }
        }
        System.out.println(compteur + " relances de souscription envoyées");
    }
    
    // Actions groupées
    public void renouvelerSouscriptionsGroupees() {
        int compteur = 0;
        for (Entite entite : entitesSelectionnees) {
            entite.setDateExpirationSouscription(LocalDate.now().plusMonths(12));
            entite.setStatutSouscription("ACTIVE");
            compteur++;
        }
        System.out.println(compteur + " souscriptions renouvelées en masse");
        entitesSelectionnees.clear();
        appliquerFiltres();
    }
    
    public void suspendreEntitesGroupees() {
        int compteur = 0;
        for (Entite entite : entitesSelectionnees) {
            entite.setStatut("SUSPENDUE");
            compteur++;
        }
        System.out.println(compteur + " entités suspendues en masse");
        entitesSelectionnees.clear();
        appliquerFiltres();
    }
    
    public void reactiverEntitesGroupees() {
        int compteur = 0;
        for (Entite entite : entitesSelectionnees) {
            entite.setStatut("ACTIVE");
            compteur++;
        }
        System.out.println(compteur + " entités réactivées en masse");
        entitesSelectionnees.clear();
        appliquerFiltres();
    }
    
    public void proposerUpgradeGroupees() {
        int compteur = 0;
        for (Entite entite : entitesSelectionnees) {
            if (entite.isQuotaProche()) {
                // Simulation d'envoi de proposition d'upgrade
                System.out.println("Proposition d'upgrade envoyée à: " + entite.getNom());
                compteur++;
            }
        }
        System.out.println(compteur + " propositions d'upgrade envoyées");
    }
    
    // Classes internes
    public static class Entite {
        private Long id;
        private String nom;
        private String codeEntite;
        private String type;
        private String region;
        private String statut;
        private int nombreMembres;
        private String adresse;
        private String telephone;
        private String email;
        private String description;
        private LocalDateTime derniereActivite;
        private Administrateur administrateur;
        
        // Informations de souscription
        private String forfaitSouscrit = "Standard";
        private int membresQuota = 200;
        private int membresUtilises;
        private LocalDate dateExpirationSouscription;
        private String statutSouscription = "ACTIVE";
        private String montantMensuel = "3 000 FCFA";
        
        // Getters et setters
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
        
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public String getCodeEntite() { return codeEntite; }
        public void setCodeEntite(String codeEntite) { this.codeEntite = codeEntite; }
        
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getRegion() { return region; }
        public void setRegion(String region) { this.region = region; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public int getNombreMembres() { return nombreMembres; }
        public void setNombreMembres(int nombreMembres) { this.nombreMembres = nombreMembres; }
        
        public String getAdresse() { return adresse; }
        public void setAdresse(String adresse) { this.adresse = adresse; }
        
        public String getTelephone() { return telephone; }
        public void setTelephone(String telephone) { this.telephone = telephone; }
        
        public String getEmail() { return email; }
        public void setEmail(String email) { this.email = email; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public LocalDateTime getDerniereActivite() { return derniereActivite; }
        public void setDerniereActivite(LocalDateTime derniereActivite) { this.derniereActivite = derniereActivite; }
        
        public Administrateur getAdministrateur() { return administrateur; }
        public void setAdministrateur(Administrateur administrateur) { this.administrateur = administrateur; }
        
        // Propriétés dérivées
        public String getTypeLibelle() {
            return switch (type) {
                case "ASSOCIATION" -> "Association";
                case "CLUB" -> "Club";
                case "GROUPE" -> "Groupe";
                case "GROUPE_JEUNES" -> "Groupe Jeunes";
                case "BRANCHE" -> "Branche";
                default -> type;
            };
        }
        
        public String getTypeSeverity() {
            return switch (type) {
                case "ASSOCIATION" -> "info";
                case "CLUB" -> "success";
                case "GROUPE" -> "warning";
                case "GROUPE_JEUNES" -> "primary";
                case "BRANCHE" -> "secondary";
                default -> "secondary";
            };
        }
        
        public String getTypeIcon() {
            return switch (type) {
                case "ASSOCIATION" -> "pi-users";
                case "CLUB" -> "pi-home";
                case "GROUPE" -> "pi-sitemap";
                case "GROUPE_JEUNES" -> "pi-star";
                case "BRANCHE" -> "pi-share-alt";
                default -> "pi-building";
            };
        }
        
        public String getStatutSeverity() {
            return switch (statut) {
                case "ACTIVE" -> "success";
                case "INACTIVE" -> "warning";
                case "SUSPENDUE" -> "danger";
                default -> "secondary";
            };
        }
        
        public String getStatutIcon() {
            return switch (statut) {
                case "ACTIVE" -> "pi-check";
                case "INACTIVE" -> "pi-pause";
                case "SUSPENDUE" -> "pi-ban";
                default -> "pi-circle";
            };
        }
        
        public String getDerniereActiviteFormatee() {
            if (derniereActivite == null) return "N/A";
            return derniereActivite.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
        }
        
        public String getDerniereActiviteRelative() {
            if (derniereActivite == null) return "";
            long jours = ChronoUnit.DAYS.between(derniereActivite.toLocalDate(), LocalDate.now());
            if (jours == 0) return "Aujourd'hui";
            if (jours == 1) return "Hier";
            if (jours < 7) return "Il y a " + jours + " jours";
            if (jours < 30) return "Il y a " + (jours / 7) + " semaine" + (jours / 7 > 1 ? "s" : "");
            return "Il y a " + (jours / 30) + " mois";
        }
        
        // Getters et setters pour les informations de souscription
        public String getForfaitSouscrit() { return forfaitSouscrit; }
        public void setForfaitSouscrit(String forfaitSouscrit) { this.forfaitSouscrit = forfaitSouscrit; }
        
        public int getMembresQuota() { return membresQuota; }
        public void setMembresQuota(int membresQuota) { this.membresQuota = membresQuota; }
        
        public int getMembresUtilises() { return membresUtilises; }
        public void setMembresUtilises(int membresUtilises) { this.membresUtilises = membresUtilises; }
        
        public LocalDate getDateExpirationSouscription() { return dateExpirationSouscription; }
        public void setDateExpirationSouscription(LocalDate dateExpirationSouscription) { this.dateExpirationSouscription = dateExpirationSouscription; }
        
        public String getStatutSouscription() { return statutSouscription; }
        public void setStatutSouscription(String statutSouscription) { this.statutSouscription = statutSouscription; }
        
        public String getMontantMensuel() { return montantMensuel; }
        public void setMontantMensuel(String montantMensuel) { this.montantMensuel = montantMensuel; }
        
        // Méthodes utilitaires pour les souscriptions
        public boolean isQuotaProche() {
            return getMembresUtilises() >= (getMembresQuota() * 0.85);
        }
        
        public boolean isQuotaAtteint() {
            return getMembresUtilises() >= getMembresQuota();
        }
        
        public boolean isExpirationProche() {
            if (dateExpirationSouscription == null) return false;
            return ChronoUnit.DAYS.between(LocalDate.now(), dateExpirationSouscription) <= 30;
        }
        
        public int getPourcentageUtilisationQuota() {
            if (membresQuota == 0) return 0;
            return (membresUtilises * 100) / membresQuota;
        }
        
        public String getForfaitCouleur() {
            return switch (forfaitSouscrit) {
                case "Starter" -> "primary";
                case "Standard" -> "success";
                case "Premium" -> "warning";
                case "Cristal" -> "info";
                default -> "secondary";
            };
        }
        
        public String getForfaitIcone() {
            return switch (forfaitSouscrit) {
                case "Starter" -> "pi-star";
                case "Standard" -> "pi-users";
                case "Premium" -> "pi-crown";
                case "Cristal" -> "pi-diamond";
                default -> "pi-circle";
            };
        }
        
        public long getJoursAvantExpiration() {
            if (dateExpirationSouscription == null) return 0;
            return ChronoUnit.DAYS.between(LocalDate.now(), dateExpirationSouscription);
        }
    }
    
    public static class Administrateur {
        private String nomComplet;
        private String email;
        
        // Getters et setters
        public String getNomComplet() { return nomComplet; }
        public void setNomComplet(String nomComplet) { this.nomComplet = nomComplet; }
        
        public String getEmail() { return email; }
        public void setEmail(String email) { this.email = email; }
    }
    
    public static class Filtres {
        private String nom;
        private String type;
        private String statut;
        private String region;
        private String forfait;
        private String alerteQuota;
        private String alerteExpiration;
        private String statutSouscription;
        
        // Getters et setters
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getRegion() { return region; }
        public void setRegion(String region) { this.region = region; }
        
        public String getForfait() { return forfait; }
        public void setForfait(String forfait) { this.forfait = forfait; }
        
        public String getAlerteQuota() { return alerteQuota; }
        public void setAlerteQuota(String alerteQuota) { this.alerteQuota = alerteQuota; }
        
        public String getAlerteExpiration() { return alerteExpiration; }
        public void setAlerteExpiration(String alerteExpiration) { this.alerteExpiration = alerteExpiration; }
        
        public String getStatutSouscription() { return statutSouscription; }
        public void setStatutSouscription(String statutSouscription) { this.statutSouscription = statutSouscription; }
    }
    
    public static class Statistiques {
        private int totalEntites;
        private int entitesActives;
        private int totalMembres;
        private String revenus;
        private int souscriptionsExpirantes;
        private int entitesQuotaAtteint;
        private String formulairePopulaire;
        private float tauxRenouvellement;
        private int moyenneMembresParEntite;
        
        // Getters et setters
        public int getTotalEntites() { return totalEntites; }
        public void setTotalEntites(int totalEntites) { this.totalEntites = totalEntites; }
        
        public int getEntitesActives() { return entitesActives; }
        public void setEntitesActives(int entitesActives) { this.entitesActives = entitesActives; }
        
        public int getTotalMembres() { return totalMembres; }
        public void setTotalMembres(int totalMembres) { this.totalMembres = totalMembres; }
        
        public String getRevenus() { return revenus; }
        public void setRevenus(String revenus) { this.revenus = revenus; }
        
        public int getSouscriptionsExpirantes() { return souscriptionsExpirantes; }
        public void setSouscriptionsExpirantes(int souscriptionsExpirantes) { this.souscriptionsExpirantes = souscriptionsExpirantes; }
        
        public int getEntitesQuotaAtteint() { return entitesQuotaAtteint; }
        public void setEntitesQuotaAtteint(int entitesQuotaAtteint) { this.entitesQuotaAtteint = entitesQuotaAtteint; }
        
        public String getFormulairePopulaire() { return formulairePopulaire; }
        public void setFormulairePopulaire(String formulairePopulaire) { this.formulairePopulaire = formulairePopulaire; }
        
        public float getTauxRenouvellement() { return tauxRenouvellement; }
        public void setTauxRenouvellement(float tauxRenouvellement) { this.tauxRenouvellement = tauxRenouvellement; }
        
        public int getMoyenneMembresParEntite() { return moyenneMembresParEntite; }
        public void setMoyenneMembresParEntite(int moyenneMembresParEntite) { this.moyenneMembresParEntite = moyenneMembresParEntite; }
        
        public String getTauxRenouvellementFormat() {
            return String.format("%.1f%%", tauxRenouvellement);
        }
    }
}