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.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Named("cotisationsGestionBean")
@SessionScoped
public class CotisationsGestionBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // Propriétés principales
    private String periodeActuelle;
    private BigDecimal tauxRecouvrement;
    private int totalMembresActifs;
    
    // KPIs financiers
    private String montantCollecte;
    private String objectifMensuel;
    private int progressionMensuelle;
    private String membresAJour;
    private int pourcentageMembresAJour;
    private String montantEnAttente;
    private int nombreCotisationsEnAttente;
    private String montantImpayes;
    private int joursRetardMoyen;
    private String revenus2024;
    private String croissanceAnnuelle;
    private String prelevementsActifs;
    private String montantPrelevementsPrevu;
    
    // Analytics
    private String periodeGraphique = "12M";
    private List<OrganisationPerformante> topOrganisations;
    private int paiementsWave = 65;
    private int paiementsVirement = 25;
    private int paiementsEspeces = 10;
    
    // Filtres
    private FiltresCotisations filtres;
    private List<Organisation> listeOrganisations;
    
    // Données et sélections
    private List<CotisationAdmin> cotisationsFiltrees;
    private List<CotisationAdmin> cotisationsSelectionnees;
    private String montantTotalSelectionne;
    
    // Wave Money
    private int membresPrelevementActif;
    private String montantPrelevementMensuel;
    private String prochainPrelevement;
    
    // Nouvelle campagne
    private NouvelleCampagne nouvelleCampagne;
    
    @PostConstruct
    public void init() {
        initializeKPIs();
        initializeFiltres();
        initializeData();
        initializeTopOrganisations();
        initializeNouvelleCampagne();
    }
    
    private void initializeKPIs() {
        this.periodeActuelle = "Décembre 2024";
        this.tauxRecouvrement = new BigDecimal("87.3");
        this.totalMembresActifs = 18547;
        
        this.montantCollecte = "2,845,000 FCFA";
        this.objectifMensuel = "3,200,000 FCFA";
        this.progressionMensuelle = 89;
        this.membresAJour = "16,205";
        this.pourcentageMembresAJour = 87;
        this.montantEnAttente = "785,000 FCFA";
        this.nombreCotisationsEnAttente = 1247;
        this.montantImpayes = "425,000 FCFA";
        this.joursRetardMoyen = 12;
        this.revenus2024 = "34,200,000 FCFA";
        this.croissanceAnnuelle = "+15.3%";
        this.prelevementsActifs = "8,450";
        this.montantPrelevementsPrevu = "42,250,000";
        
        this.membresPrelevementActif = 8450;
        this.montantPrelevementMensuel = "42,250,000 FCFA";
        this.prochainPrelevement = "01/01/2025";
        
        this.cotisationsSelectionnees = new ArrayList<>();
        this.montantTotalSelectionne = "0 FCFA";
    }
    
    private void initializeFiltres() {
        this.filtres = new FiltresCotisations();
        this.listeOrganisations = new ArrayList<>();
        
        // Simulation d'organisations
        for (int i = 1; i <= 127; i++) {
            Organisation org = new Organisation();
            org.setId((long) i);
            org.setNom("Organisation " + i);
            listeOrganisations.add(org);
        }
    }
    
    private void initializeData() {
        this.cotisationsFiltrees = new ArrayList<>();
        
        // Simulation de données de cotisations pour les 127 organisations
        for (int i = 1; i <= 500; i++) {
            CotisationAdmin cotisation = new CotisationAdmin();
            cotisation.setId((long) i);
            cotisation.setNomOrganisation("Organisation " + ((i % 127) + 1));
            cotisation.setRegionOrganisation("Région " + ((i % 12) + 1));
            cotisation.setIconeOrganisation("pi-building");
            
            cotisation.setNomCompletMembre("Membre " + i);
            cotisation.setNumeroMembre("M" + String.format("%06d", i));
            cotisation.setInitialesMembre(getInitiales("Membre " + i));
            cotisation.setTypeMembre(i % 3 == 0 ? "Membre Actif" : "Membre Associé");
            
            cotisation.setType(getTypeCotisation(i));
            cotisation.setPeriode(getperiode(i));
            cotisation.setAnnee("2024");
            cotisation.setMontant(new BigDecimal(getMontantCotisation(i)));
            cotisation.setStatut(getStatutCotisation(i));
            cotisation.setDateEcheance(LocalDate.now().minusDays(i % 60));
            
            if (cotisation.getStatut().equals("PAYE")) {
                cotisation.setDatePaiement(cotisation.getDateEcheance().plusDays(i % 10));
                cotisation.setModePaiement(getModePaiement(i));
            }
            
            cotisationsFiltrees.add(cotisation);
        }
    }
    
    private void initializeTopOrganisations() {
        this.topOrganisations = new ArrayList<>();
        
        String[] noms = {"Lions Club Dakar Centre", "Association Thiès Nord", "Groupe Kaolack Est", 
                        "Lions Club Saint-Louis", "Association Louga Centre"};
        int[] taux = {98, 95, 92, 89, 87};
        String[] montants = {"485K", "420K", "380K", "365K", "340K"};
        int[] membres = {156, 134, 128, 145, 120};
        int[] totaux = {160, 145, 140, 165, 135};
        
        for (int i = 0; i < noms.length; i++) {
            OrganisationPerformante org = new OrganisationPerformante();
            org.setNom(noms[i]);
            org.setTauxRecouvrement(taux[i]);
            org.setMontantCollecte(montants[i]);
            org.setNombreMembresAJour(membres[i]);
            org.setTotalMembres(totaux[i]);
            topOrganisations.add(org);
        }
    }
    
    private void initializeNouvelleCampagne() {
        this.nouvelleCampagne = new NouvelleCampagne();
    }
    
    private String getTypeCotisation(int i) {
        return switch (i % 4) {
            case 0 -> "MENSUELLE";
            case 1 -> "SPECIALE";
            case 2 -> "ADHESION";
            default -> "EVENEMENT";
        };
    }
    
    private String getperiode(int i) {
        String[] mois = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
                        "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"};
        return mois[i % 12] + " 2024";
    }
    
    private int getMontantCotisation(int i) {
        return switch (i % 4) {
            case 0 -> 5000;  // Mensuelle
            case 1 -> 15000; // Spéciale
            case 2 -> 25000; // Adhésion
            default -> 10000; // Événement
        };
    }
    
    private String getStatutCotisation(int i) {
        return switch (i % 4) {
            case 0 -> "PAYE";
            case 1 -> "EN_ATTENTE";
            case 2 -> "EN_RETARD";
            default -> "PAYE";
        };
    }
    
    private String getModePaiement(int i) {
        return switch (i % 3) {
            case 0 -> "WAVE";
            case 1 -> "VIREMENT";
            default -> "ESPECES";
        };
    }
    
    private String getInitiales(String nom) {
        String[] parts = nom.split(" ");
        return parts.length >= 2 ? 
            String.valueOf(parts[0].charAt(0)) + String.valueOf(parts[1].charAt(0)) :
            String.valueOf(nom.charAt(0)) + "M";
    }
    
    // Actions principales
    public void creerCampagne() {
        System.out.println("Création de la campagne: " + nouvelleCampagne.getNom());
        // Logique de création de campagne
        initializeNouvelleCampagne(); // Reset pour nouvelle campagne
    }
    
    public void relancesGroupees() {
        System.out.println("Envoi de relances groupées");
    }
    
    public void exporterTout() {
        System.out.println("Export global des cotisations");
    }
    
    public void appliquerFiltres() {
        // Logique de filtrage
        System.out.println("Application des filtres");
    }
    
    public void reinitialiserFiltres() {
        this.filtres = new FiltresCotisations();
        System.out.println("Réinitialisation des filtres");
    }
    
    public void exporterExcel() {
        System.out.println("Export Excel des cotisations filtrées");
    }
    
    // Actions sur cotisations individuelles
    public void enregistrerPaiement(CotisationAdmin cotisation) {
        System.out.println("Enregistrement paiement pour: " + cotisation.getNumeroMembre());
    }
    
    public void genererRecu(CotisationAdmin cotisation) {
        System.out.println("Génération reçu pour: " + cotisation.getNumeroMembre());
    }
    
    public void envoyerRappel(CotisationAdmin cotisation) {
        System.out.println("Envoi rappel pour: " + cotisation.getNumeroMembre());
    }
    
    public void voirDetails(CotisationAdmin cotisation) {
        System.out.println("Affichage détails pour: " + cotisation.getNumeroMembre());
    }
    
    // Actions groupées
    public void marquerPayeesGroupees() {
        System.out.println("Marquage " + cotisationsSelectionnees.size() + " cotisations comme payées");
    }
    
    public void envoyerRelancesGroupees() {
        System.out.println("Envoi relances pour " + cotisationsSelectionnees.size() + " cotisations");
    }
    
    public void genererRecusGroupes() {
        System.out.println("Génération reçus pour " + cotisationsSelectionnees.size() + " cotisations");
    }
    
    public void annulerCotisationsGroupees() {
        System.out.println("Annulation " + cotisationsSelectionnees.size() + " cotisations");
    }
    
    // Wave Money
    public void lancerPrelevements() {
        System.out.println("Lancement des prélèvements Wave Money");
    }
    
    public void testerAPIWave() {
        System.out.println("Test de l'API Wave Money");
    }
    
    public void voirHistoriquePrelevements() {
        System.out.println("Affichage historique des prélèvements");
    }
    
    // Actions rapides
    public void genererRapportMensuel() {
        System.out.println("Génération rapport mensuel");
    }
    
    public void configurerRelancesAuto() {
        System.out.println("Configuration relances automatiques");
    }
    
    public void gererTypesCotisations() {
        System.out.println("Gestion des types de cotisations");
    }
    
    public void tableauDeBord() {
        System.out.println("Affichage tableau de bord");
    }
    
    // Getters et Setters
    public String getPeriodeActuelle() { return periodeActuelle; }
    public void setPeriodeActuelle(String periodeActuelle) { this.periodeActuelle = periodeActuelle; }
    
    public BigDecimal getTauxRecouvrement() { return tauxRecouvrement; }
    public void setTauxRecouvrement(BigDecimal tauxRecouvrement) { this.tauxRecouvrement = tauxRecouvrement; }
    
    public int getTotalMembresActifs() { return totalMembresActifs; }
    public void setTotalMembresActifs(int totalMembresActifs) { this.totalMembresActifs = totalMembresActifs; }
    
    public String getMontantCollecte() { return montantCollecte; }
    public void setMontantCollecte(String montantCollecte) { this.montantCollecte = montantCollecte; }
    
    public String getObjectifMensuel() { return objectifMensuel; }
    public void setObjectifMensuel(String objectifMensuel) { this.objectifMensuel = objectifMensuel; }
    
    public int getProgressionMensuelle() { return progressionMensuelle; }
    public void setProgressionMensuelle(int progressionMensuelle) { this.progressionMensuelle = progressionMensuelle; }
    
    public String getMembresAJour() { return membresAJour; }
    public void setMembresAJour(String membresAJour) { this.membresAJour = membresAJour; }
    
    public int getPourcentageMembresAJour() { return pourcentageMembresAJour; }
    public void setPourcentageMembresAJour(int pourcentageMembresAJour) { this.pourcentageMembresAJour = pourcentageMembresAJour; }
    
    public String getMontantEnAttente() { return montantEnAttente; }
    public void setMontantEnAttente(String montantEnAttente) { this.montantEnAttente = montantEnAttente; }
    
    public int getNombreCotisationsEnAttente() { return nombreCotisationsEnAttente; }
    public void setNombreCotisationsEnAttente(int nombreCotisationsEnAttente) { this.nombreCotisationsEnAttente = nombreCotisationsEnAttente; }
    
    public String getMontantImpayes() { return montantImpayes; }
    public void setMontantImpayes(String montantImpayes) { this.montantImpayes = montantImpayes; }
    
    public int getJoursRetardMoyen() { return joursRetardMoyen; }
    public void setJoursRetardMoyen(int joursRetardMoyen) { this.joursRetardMoyen = joursRetardMoyen; }
    
    public String getRevenus2024() { return revenus2024; }
    public void setRevenus2024(String revenus2024) { this.revenus2024 = revenus2024; }
    
    public String getCroissanceAnnuelle() { return croissanceAnnuelle; }
    public void setCroissanceAnnuelle(String croissanceAnnuelle) { this.croissanceAnnuelle = croissanceAnnuelle; }
    
    public String getPrelevementsActifs() { return prelevementsActifs; }
    public void setPrelevementsActifs(String prelevementsActifs) { this.prelevementsActifs = prelevementsActifs; }
    
    public String getMontantPrelevementsPrevu() { return montantPrelevementsPrevu; }
    public void setMontantPrelevementsPrevu(String montantPrelevementsPrevu) { this.montantPrelevementsPrevu = montantPrelevementsPrevu; }
    
    public String getPeriodeGraphique() { return periodeGraphique; }
    public void setPeriodeGraphique(String periodeGraphique) { this.periodeGraphique = periodeGraphique; }
    
    public List<OrganisationPerformante> getTopOrganisations() { return topOrganisations; }
    public void setTopOrganisations(List<OrganisationPerformante> topOrganisations) { this.topOrganisations = topOrganisations; }
    
    public int getPaiementsWave() { return paiementsWave; }
    public void setPaiementsWave(int paiementsWave) { this.paiementsWave = paiementsWave; }
    
    public int getPaiementsVirement() { return paiementsVirement; }
    public void setPaiementsVirement(int paiementsVirement) { this.paiementsVirement = paiementsVirement; }
    
    public int getPaiementsEspeces() { return paiementsEspeces; }
    public void setPaiementsEspeces(int paiementsEspeces) { this.paiementsEspeces = paiementsEspeces; }
    
    public FiltresCotisations getFiltres() { return filtres; }
    public void setFiltres(FiltresCotisations filtres) { this.filtres = filtres; }
    
    public List<Organisation> getListeOrganisations() { return listeOrganisations; }
    public void setListeOrganisations(List<Organisation> listeOrganisations) { this.listeOrganisations = listeOrganisations; }
    
    public List<CotisationAdmin> getCotisationsFiltrees() { return cotisationsFiltrees; }
    public void setCotisationsFiltrees(List<CotisationAdmin> cotisationsFiltrees) { this.cotisationsFiltrees = cotisationsFiltrees; }
    
    public List<CotisationAdmin> getCotisationsSelectionnees() { return cotisationsSelectionnees; }
    public void setCotisationsSelectionnees(List<CotisationAdmin> cotisationsSelectionnees) { 
        this.cotisationsSelectionnees = cotisationsSelectionnees;
        calculerMontantTotalSelectionne();
    }
    
    public String getMontantTotalSelectionne() { return montantTotalSelectionne; }
    public void setMontantTotalSelectionne(String montantTotalSelectionne) { this.montantTotalSelectionne = montantTotalSelectionne; }
    
    public int getMembresPrelevementActif() { return membresPrelevementActif; }
    public void setMembresPrelevementActif(int membresPrelevementActif) { this.membresPrelevementActif = membresPrelevementActif; }
    
    public String getMontantPrelevementMensuel() { return montantPrelevementMensuel; }
    public void setMontantPrelevementMensuel(String montantPrelevementMensuel) { this.montantPrelevementMensuel = montantPrelevementMensuel; }
    
    public String getProchainPrelevement() { return prochainPrelevement; }
    public void setProchainPrelevement(String prochainPrelevement) { this.prochainPrelevement = prochainPrelevement; }
    
    public NouvelleCampagne getNouvelleCampagne() { return nouvelleCampagne; }
    public void setNouvelleCampagne(NouvelleCampagne nouvelleCampagne) { this.nouvelleCampagne = nouvelleCampagne; }
    
    private void calculerMontantTotalSelectionne() {
        if (cotisationsSelectionnees != null && !cotisationsSelectionnees.isEmpty()) {
            BigDecimal total = cotisationsSelectionnees.stream()
                .map(CotisationAdmin::getMontant)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
            this.montantTotalSelectionne = String.format("%,.0f FCFA", total);
        } else {
            this.montantTotalSelectionne = "0 FCFA";
        }
    }
    
    // Classes internes pour les données
    public static class CotisationAdmin {
        private Long id;
        private String nomOrganisation;
        private String regionOrganisation;
        private String iconeOrganisation;
        private String nomCompletMembre;
        private String numeroMembre;
        private String initialesMembre;
        private String typeMembre;
        private String type;
        private String periode;
        private String annee;
        private BigDecimal montant;
        private String statut;
        private LocalDate dateEcheance;
        private LocalDate datePaiement;
        private String modePaiement;
        
        // Getters et setters
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
        
        public String getNomOrganisation() { return nomOrganisation; }
        public void setNomOrganisation(String nomOrganisation) { this.nomOrganisation = nomOrganisation; }
        
        public String getRegionOrganisation() { return regionOrganisation; }
        public void setRegionOrganisation(String regionOrganisation) { this.regionOrganisation = regionOrganisation; }
        
        public String getIconeOrganisation() { return iconeOrganisation; }
        public void setIconeOrganisation(String iconeOrganisation) { this.iconeOrganisation = iconeOrganisation; }
        
        public String getNomCompletMembre() { return nomCompletMembre; }
        public void setNomCompletMembre(String nomCompletMembre) { this.nomCompletMembre = nomCompletMembre; }
        
        public String getNumeroMembre() { return numeroMembre; }
        public void setNumeroMembre(String numeroMembre) { this.numeroMembre = numeroMembre; }
        
        public String getInitialesMembre() { return initialesMembre; }
        public void setInitialesMembre(String initialesMembre) { this.initialesMembre = initialesMembre; }
        
        public String getTypeMembre() { return typeMembre; }
        public void setTypeMembre(String typeMembre) { this.typeMembre = typeMembre; }
        
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getPeriode() { return periode; }
        public void setPeriode(String periode) { this.periode = periode; }
        
        public String getAnnee() { return annee; }
        public void setAnnee(String annee) { this.annee = annee; }
        
        public BigDecimal getMontant() { return montant; }
        public void setMontant(BigDecimal montant) { this.montant = montant; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public LocalDate getDateEcheance() { return dateEcheance; }
        public void setDateEcheance(LocalDate dateEcheance) { this.dateEcheance = dateEcheance; }
        
        public LocalDate getDatePaiement() { return datePaiement; }
        public void setDatePaiement(LocalDate datePaiement) { this.datePaiement = datePaiement; }
        
        public String getModePaiement() { return modePaiement; }
        public void setModePaiement(String modePaiement) { this.modePaiement = modePaiement; }
        
        // Propriétés dérivées pour l'affichage
        public String getTypeLibelle() {
            return switch (type) {
                case "MENSUELLE" -> "Mensuelle";
                case "SPECIALE" -> "Spéciale";
                case "ADHESION" -> "Adhésion";
                case "EVENEMENT" -> "Événement";
                default -> type;
            };
        }
        
        public String getTypeSeverity() {
            return switch (type) {
                case "MENSUELLE" -> "info";
                case "SPECIALE" -> "warning";
                case "ADHESION" -> "success";
                case "EVENEMENT" -> "primary";
                default -> "secondary";
            };
        }
        
        public String getTypeIcon() {
            return switch (type) {
                case "MENSUELLE" -> "pi-calendar";
                case "SPECIALE" -> "pi-star";
                case "ADHESION" -> "pi-user-plus";
                case "EVENEMENT" -> "pi-calendar-plus";
                default -> "pi-circle";
            };
        }
        
        public String getMontantFormatte() {
            return String.format("%,.0f", montant);
        }
        
        public String getStatutLibelle() {
            return switch (statut) {
                case "PAYE" -> "Payée";
                case "EN_ATTENTE" -> "En attente";
                case "EN_RETARD" -> "En retard";
                case "ANNULE" -> "Annulée";
                default -> statut;
            };
        }
        
        public String getStatutSeverity() {
            return switch (statut) {
                case "PAYE" -> "success";
                case "EN_ATTENTE" -> "warning";
                case "EN_RETARD" -> "danger";
                case "ANNULE" -> "secondary";
                default -> "secondary";
            };
        }
        
        public String getStatutIcon() {
            return switch (statut) {
                case "PAYE" -> "pi-check";
                case "EN_ATTENTE" -> "pi-clock";
                case "EN_RETARD" -> "pi-exclamation-triangle";
                case "ANNULE" -> "pi-times";
                default -> "pi-circle";
            };
        }
        
        public String getDateEcheanceFormattee() {
            return dateEcheance != null ? dateEcheance.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "";
        }
        
        public String getDatePaiementFormattee() {
            return datePaiement != null ? datePaiement.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "";
        }
        
        public String getRetardTexte() {
            if (dateEcheance == null) return "";
            long jours = java.time.temporal.ChronoUnit.DAYS.between(dateEcheance, LocalDate.now());
            if (jours <= 0) return "À temps";
            if (jours <= 7) return jours + "j retard";
            if (jours <= 30) return jours + "j retard";
            return "+30j retard";
        }
        
        public String getRetardCouleur() {
            if (dateEcheance == null) return "text-600";
            long jours = java.time.temporal.ChronoUnit.DAYS.between(dateEcheance, LocalDate.now());
            if (jours <= 0) return "text-green-500";
            if (jours <= 7) return "text-orange-500";
            return "text-red-500";
        }
        
        public String getModePaiementLibelle() {
            return switch (modePaiement != null ? modePaiement : "") {
                case "WAVE" -> "Wave Money";
                case "VIREMENT" -> "Virement";
                case "ESPECES" -> "Espèces";
                case "ORANGE" -> "Orange Money";
                default -> modePaiement;
            };
        }
        
        public String getModePaiementIcon() {
            return switch (modePaiement != null ? modePaiement : "") {
                case "WAVE" -> "pi-mobile";
                case "VIREMENT" -> "pi-building";
                case "ESPECES" -> "pi-money-bill";
                case "ORANGE" -> "pi-mobile";
                default -> "pi-circle";
            };
        }
    }
    
    public static class FiltresCotisations {
        private String organisation = "";
        private String periode = "MOIS";
        private String statut = "";
        private String type = "";
        private String recherche = "";
        private BigDecimal montantMin;
        private BigDecimal montantMax;
        private String retardJours = "";
        private String modePaiement = "";
        
        // Getters et setters
        public String getOrganisation() { return organisation; }
        public void setOrganisation(String organisation) { this.organisation = organisation; }
        
        public String getPeriode() { return periode; }
        public void setPeriode(String periode) { this.periode = periode; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getRecherche() { return recherche; }
        public void setRecherche(String recherche) { this.recherche = recherche; }
        
        public BigDecimal getMontantMin() { return montantMin; }
        public void setMontantMin(BigDecimal montantMin) { this.montantMin = montantMin; }
        
        public BigDecimal getMontantMax() { return montantMax; }
        public void setMontantMax(BigDecimal montantMax) { this.montantMax = montantMax; }
        
        public String getRetardJours() { return retardJours; }
        public void setRetardJours(String retardJours) { this.retardJours = retardJours; }
        
        public String getModePaiement() { return modePaiement; }
        public void setModePaiement(String modePaiement) { this.modePaiement = modePaiement; }
    }
    
    public static class Organisation {
        private Long id;
        private String nom;
        
        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 static class OrganisationPerformante {
        private String nom;
        private int tauxRecouvrement;
        private String montantCollecte;
        private int nombreMembresAJour;
        private int totalMembres;
        
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public int getTauxRecouvrement() { return tauxRecouvrement; }
        public void setTauxRecouvrement(int tauxRecouvrement) { this.tauxRecouvrement = tauxRecouvrement; }
        
        public String getMontantCollecte() { return montantCollecte; }
        public void setMontantCollecte(String montantCollecte) { this.montantCollecte = montantCollecte; }
        
        public int getNombreMembresAJour() { return nombreMembresAJour; }
        public void setNombreMembresAJour(int nombreMembresAJour) { this.nombreMembresAJour = nombreMembresAJour; }
        
        public int getTotalMembres() { return totalMembres; }
        public void setTotalMembres(int totalMembres) { this.totalMembres = totalMembres; }
    }
    
    public static class NouvelleCampagne {
        private String nom;
        private String type;
        private BigDecimal montant;
        private LocalDate dateEcheance;
        private String scope = "TOUTES";
        private String description;
        private boolean relanceAutomatique = true;
        
        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 BigDecimal getMontant() { return montant; }
        public void setMontant(BigDecimal montant) { this.montant = montant; }
        
        public LocalDate getDateEcheance() { return dateEcheance; }
        public void setDateEcheance(LocalDate dateEcheance) { this.dateEcheance = dateEcheance; }
        
        public String getScope() { return scope; }
        public void setScope(String scope) { this.scope = scope; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public boolean isRelanceAutomatique() { return relanceAutomatique; }
        public void setRelanceAutomatique(boolean relanceAutomatique) { this.relanceAutomatique = relanceAutomatique; }
    }
}