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.util.ArrayList;
import java.util.List;

@Named("membreCotisationBean")
@SessionScoped
public class MembreCotisationBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // Propriétés de base
    private String numeroMembre;
    private String statutCotisations;
    private String derniereMAJ;
    private boolean peutPayer;
    
    // Statistiques
    private int cotisationsPayees;
    private int cotisationsEnAttente;
    private BigDecimal montantDu;
    private BigDecimal totalVerse;
    private int progressionAnnuelle;
    
    // Filtres
    private String anneeFilter = "2024";
    private String statutFilter = "";
    private String typeFilter = "";
    
    // Paiement
    private Object cotisationSelectionnee;
    private String modePaiementChoisi = "WAVE";
    private String numeroWave;
    private String commentairePaiement;
    private BigDecimal montantAPayer = BigDecimal.ZERO;
    private String banqueAssociation = "Banque Atlantique";
    private String ibanAssociation = "SN12 1234 5678 9012 3456 7890 12";
    
    // Prélèvement automatique
    private String numeroWaveAuto;
    private int jourPrelevement = 5;
    private boolean notificationSMS = true;
    private String cotisationMensuelle = "5,000 FCFA";
    
    // Listes
    private List<Cotisation> cotisations = new ArrayList<>();
    private List<Echeance> prochainesEcheances = new ArrayList<>();
    private List<Cotisation> cotisationsImpayees = new ArrayList<>();
    
    // Totaux périodes
    private BigDecimal totalPayePeriode = BigDecimal.ZERO;
    private BigDecimal totalEnAttentePeriode = BigDecimal.ZERO;
    private BigDecimal totalEnRetardPeriode = BigDecimal.ZERO;
    private int tauxConformite = 85;
    
    // État
    private String statutMembre = "Actif";
    private String typeMembre = "Membre Actif";
    private String statutSeverity = "success";
    private int scorePonctualite = 85;
    private String commentairePonctualite = "Excellent membre, toujours à jour";
    
    @PostConstruct
    public void init() {
        this.numeroMembre = "M240001";
        this.statutCotisations = "À jour";
        this.derniereMAJ = "15/12/2024";
        this.peutPayer = true;
        this.cotisationsPayees = 10;
        this.cotisationsEnAttente = 2;
        this.montantDu = new BigDecimal(10000);
        this.totalVerse = new BigDecimal(50000);
        this.progressionAnnuelle = 83;
        
        initializeCotisations();
        initializeEcheances();
    }
    
    private void initializeCotisations() {
        // Simulation de données
        for (int i = 1; i <= 12; i++) {
            Cotisation cotisation = new Cotisation();
            cotisation.setReference("COT2024" + String.format("%03d", i));
            cotisation.setLibelle("Cotisation " + getMonthName(i) + " 2024");
            cotisation.setPeriode(getMonthName(i) + " 2024");
            cotisation.setType("MENSUELLE");
            cotisation.setMontant(new BigDecimal(5000));
            cotisation.setStatut(i <= 10 ? "PAYE" : "EN_ATTENTE");
            cotisation.setDateEcheance(LocalDate.of(2024, i, 15));
            if (i <= 10) {
                cotisation.setDatePaiement(LocalDate.of(2024, i, i <= 5 ? 10 : 20));
                cotisation.setModePaiement("Wave Money");
            }
            cotisations.add(cotisation);
            
            if (i > 10) {
                cotisationsImpayees.add(cotisation);
            }
        }
    }
    
    private void initializeEcheances() {
        Echeance echeance1 = new Echeance();
        echeance1.setLibelle("Cotisation Novembre 2024");
        echeance1.setPeriode("Novembre 2024");
        echeance1.setMontant("5,000 FCFA");
        echeance1.setDateEcheance("15/11/2024");
        echeance1.setUrgence("En retard");
        echeance1.setCouleurUrgence("border-red-500");
        prochainesEcheances.add(echeance1);
        
        Echeance echeance2 = new Echeance();
        echeance2.setLibelle("Cotisation Décembre 2024");
        echeance2.setPeriode("Décembre 2024");
        echeance2.setMontant("5,000 FCFA");
        echeance2.setDateEcheance("15/12/2024");
        echeance2.setUrgence("Bientôt");
        echeance2.setCouleurUrgence("border-orange-500");
        prochainesEcheances.add(echeance2);
    }
    
    private String getMonthName(int month) {
        String[] months = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
                          "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"};
        return months[month - 1];
    }
    
    // Actions
    public String voirHistoriqueComplet() {
        return "/pages/membre/historique-cotisations?faces-redirect=true";
    }
    
    public void telechargerRecus() {
        // Logique de téléchargement des reçus
    }
    
    public void payerCotisation(Object cotisation) {
        // Logique de paiement d'une cotisation
    }
    
    public void actualiser() {
        // Actualiser les données
        init();
    }
    
    public String confirmerPaiement() {
        // Logique de confirmation de paiement
        return null;
    }
    
    public void paiementWave() {
        // Logique de paiement Wave Money
    }
    
    public void genererAttestation() {
        // Logique de génération d'attestation
    }
    
    public void demanderRecu() {
        // Logique de demande de reçu
    }
    
    public void activerPrelevementAuto() {
        // Logique d'activation du prélèvement automatique
    }
    
    public void telechargerRecu(Object cotisation) {
        // Logique de téléchargement de reçu
    }
    
    public void voirDetails(Object cotisation) {
        // Logique d'affichage des détails
    }
    
    // Getters et Setters
    public String getNumeroMembre() { return numeroMembre; }
    public void setNumeroMembre(String numeroMembre) { this.numeroMembre = numeroMembre; }
    
    public String getStatutCotisations() { return statutCotisations; }
    public void setStatutCotisations(String statutCotisations) { this.statutCotisations = statutCotisations; }
    
    public String getDerniereMAJ() { return derniereMAJ; }
    public void setDerniereMAJ(String derniereMAJ) { this.derniereMAJ = derniereMAJ; }
    
    public boolean isPeutPayer() { return peutPayer; }
    public void setPeutPayer(boolean peutPayer) { this.peutPayer = peutPayer; }
    
    public int getCotisationsPayees() { return cotisationsPayees; }
    public void setCotisationsPayees(int cotisationsPayees) { this.cotisationsPayees = cotisationsPayees; }
    
    public int getCotisationsEnAttente() { return cotisationsEnAttente; }
    public void setCotisationsEnAttente(int cotisationsEnAttente) { this.cotisationsEnAttente = cotisationsEnAttente; }
    
    public BigDecimal getMontantDu() { return montantDu; }
    public void setMontantDu(BigDecimal montantDu) { this.montantDu = montantDu; }
    
    public BigDecimal getTotalVerse() { return totalVerse; }
    public void setTotalVerse(BigDecimal totalVerse) { this.totalVerse = totalVerse; }
    
    public int getProgressionAnnuelle() { return progressionAnnuelle; }
    public void setProgressionAnnuelle(int progressionAnnuelle) { this.progressionAnnuelle = progressionAnnuelle; }
    
    public String getAnneeFilter() { return anneeFilter; }
    public void setAnneeFilter(String anneeFilter) { this.anneeFilter = anneeFilter; }
    
    public String getStatutFilter() { return statutFilter; }
    public void setStatutFilter(String statutFilter) { this.statutFilter = statutFilter; }
    
    public String getTypeFilter() { return typeFilter; }
    public void setTypeFilter(String typeFilter) { this.typeFilter = typeFilter; }
    
    public List<Cotisation> getCotisations() { return cotisations; }
    public void setCotisations(List<Cotisation> cotisations) { this.cotisations = cotisations; }
    
    public List<Echeance> getProchainesEcheances() { return prochainesEcheances; }
    public void setProchainesEcheances(List<Echeance> prochainesEcheances) { this.prochainesEcheances = prochainesEcheances; }
    
    public Object getCotisationSelectionnee() { return cotisationSelectionnee; }
    public void setCotisationSelectionnee(Object cotisationSelectionnee) { this.cotisationSelectionnee = cotisationSelectionnee; }
    
    public List<Cotisation> getCotisationsImpayees() { return cotisationsImpayees; }
    public void setCotisationsImpayees(List<Cotisation> cotisationsImpayees) { this.cotisationsImpayees = cotisationsImpayees; }
    
    public String getModePaiementChoisi() { return modePaiementChoisi; }
    public void setModePaiementChoisi(String modePaiementChoisi) { this.modePaiementChoisi = modePaiementChoisi; }
    
    public String getNumeroWave() { return numeroWave; }
    public void setNumeroWave(String numeroWave) { this.numeroWave = numeroWave; }
    
    public String getCommentairePaiement() { return commentairePaiement; }
    public void setCommentairePaiement(String commentairePaiement) { this.commentairePaiement = commentairePaiement; }
    
    public BigDecimal getMontantAPayer() { return montantAPayer; }
    public void setMontantAPayer(BigDecimal montantAPayer) { this.montantAPayer = montantAPayer; }
    
    public String getBanqueAssociation() { return banqueAssociation; }
    public void setBanqueAssociation(String banqueAssociation) { this.banqueAssociation = banqueAssociation; }
    
    public String getIbanAssociation() { return ibanAssociation; }
    public void setIbanAssociation(String ibanAssociation) { this.ibanAssociation = ibanAssociation; }
    
    public String getNumeroWaveAuto() { return numeroWaveAuto; }
    public void setNumeroWaveAuto(String numeroWaveAuto) { this.numeroWaveAuto = numeroWaveAuto; }
    
    public int getJourPrelevement() { return jourPrelevement; }
    public void setJourPrelevement(int jourPrelevement) { this.jourPrelevement = jourPrelevement; }
    
    public boolean isNotificationSMS() { return notificationSMS; }
    public void setNotificationSMS(boolean notificationSMS) { this.notificationSMS = notificationSMS; }
    
    public String getCotisationMensuelle() { return cotisationMensuelle; }
    public void setCotisationMensuelle(String cotisationMensuelle) { this.cotisationMensuelle = cotisationMensuelle; }
    
    public BigDecimal getTotalPayePeriode() { return totalPayePeriode; }
    public void setTotalPayePeriode(BigDecimal totalPayePeriode) { this.totalPayePeriode = totalPayePeriode; }
    
    public BigDecimal getTotalEnAttentePeriode() { return totalEnAttentePeriode; }
    public void setTotalEnAttentePeriode(BigDecimal totalEnAttentePeriode) { this.totalEnAttentePeriode = totalEnAttentePeriode; }
    
    public BigDecimal getTotalEnRetardPeriode() { return totalEnRetardPeriode; }
    public void setTotalEnRetardPeriode(BigDecimal totalEnRetardPeriode) { this.totalEnRetardPeriode = totalEnRetardPeriode; }
    
    public int getTauxConformite() { return tauxConformite; }
    public void setTauxConformite(int tauxConformite) { this.tauxConformite = tauxConformite; }
    
    public String getStatutMembre() { return statutMembre; }
    public void setStatutMembre(String statutMembre) { this.statutMembre = statutMembre; }
    
    public String getTypeMembre() { return typeMembre; }
    public void setTypeMembre(String typeMembre) { this.typeMembre = typeMembre; }
    
    public String getStatutSeverity() { return statutSeverity; }
    public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; }
    
    public int getScorePonctualite() { return scorePonctualite; }
    public void setScorePonctualite(int scorePonctualite) { this.scorePonctualite = scorePonctualite; }
    
    public String getCommentairePonctualite() { return commentairePonctualite; }
    public void setCommentairePonctualite(String commentairePonctualite) { this.commentairePonctualite = commentairePonctualite; }
    
    public boolean isPeutPayerWave() { return true; }
    
    // Méthodes pour les charts
    public Object getHistoriquePaiementsChart() {
        // Retourner un objet chart model vide pour l'instant
        return null;
    }
    
    // Classes internes pour les données
    public static class Cotisation {
        private String reference;
        private String libelle;
        private String periode;
        private String type;
        private BigDecimal montant;
        private String statut;
        private LocalDate dateEcheance;
        private LocalDate datePaiement;
        private String modePaiement;
        
        // Getters et setters
        public String getReference() { return reference; }
        public void setReference(String reference) { this.reference = reference; }
        
        public String getLibelle() { return libelle; }
        public void setLibelle(String libelle) { this.libelle = libelle; }
        
        public String getPeriode() { return periode; }
        public void setPeriode(String periode) { this.periode = periode; }
        
        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 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 getTypeSeverity() {
            return switch (type) {
                case "MENSUELLE" -> "info";
                case "SPECIALE" -> "warning";
                case "ADHESION" -> "success";
                default -> "secondary";
            };
        }
        
        public String getTypeIcon() {
            return switch (type) {
                case "MENSUELLE" -> "pi-calendar";
                case "SPECIALE" -> "pi-star";
                case "ADHESION" -> "pi-user-plus";
                default -> "pi-circle";
            };
        }
        
        public String getStatutSeverity() {
            return switch (statut) {
                case "PAYE" -> "success";
                case "EN_ATTENTE" -> "warning";
                case "EN_RETARD" -> "danger";
                default -> "secondary";
            };
        }
        
        public String getStatutIcon() {
            return switch (statut) {
                case "PAYE" -> "pi-check";
                case "EN_ATTENTE" -> "pi-clock";
                case "EN_RETARD" -> "pi-exclamation-triangle";
                default -> "pi-circle";
            };
        }
        
        public String getRetardColor() {
            return switch (statut) {
                case "EN_RETARD" -> "text-red-500";
                case "EN_ATTENTE" -> "text-orange-500";
                default -> "text-600";
            };
        }
        
        public String getStatutEcheance() {
            return switch (statut) {
                case "EN_RETARD" -> "En retard";
                case "EN_ATTENTE" -> "À venir";
                default -> "Payée";
            };
        }
        
        public String getModePaiementIcon() {
            return switch (modePaiement != null ? modePaiement : "") {
                case "Wave Money" -> "pi-mobile";
                case "Virement" -> "pi-building";
                case "Espèces" -> "pi-money-bill";
                default -> "pi-circle";
            };
        }
        
        public String getCouleurMontant() {
            return "text-900";
        }
    }
    
    public static class Echeance {
        private String libelle;
        private String periode;
        private String montant;
        private String dateEcheance;
        private String urgence;
        private String couleurUrgence;
        
        // Getters et setters
        public String getLibelle() { return libelle; }
        public void setLibelle(String libelle) { this.libelle = libelle; }
        
        public String getPeriode() { return periode; }
        public void setPeriode(String periode) { this.periode = periode; }
        
        public String getMontant() { return montant; }
        public void setMontant(String montant) { this.montant = montant; }
        
        public String getDateEcheance() { return dateEcheance; }
        public void setDateEcheance(String dateEcheance) { this.dateEcheance = dateEcheance; }
        
        public String getUrgence() { return urgence; }
        public void setUrgence(String urgence) { this.urgence = urgence; }
        
        public String getCouleurUrgence() { return couleurUrgence; }
        public void setCouleurUrgence(String couleurUrgence) { this.couleurUrgence = couleurUrgence; }
        
        public String getUrgenceSeverity() {
            return switch (urgence) {
                case "En retard" -> "danger";
                case "Bientôt" -> "warning";
                default -> "info";
            };
        }
        
        public String getCouleurMontant() {
            return "text-900";
        }
    }
}