package dev.lions.unionflow.client.view;

import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Named("dashboardBean")
@RequestScoped
public class DashboardBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // Propriétés existantes
    private int activeMembers = 245;
    private String totalCotisations = "12,450,000";
    private int pendingAides = 7;
    private int upcomingEvents = 3;
    
    // Nouvelles propriétés pour le dashboard enrichi
    private int totalMembers = 268;
    private String aidesDistribuees = "3,200,000";
    private int tauxParticipation = 78;
    
    // Propriétés pour les alertes
    private int cotisationsRetard = 12;
    private int adhesionsExpiration = 8;
    private int demandesToTraiter = 15;
    private int tachesFinaliser = 4;
    
    // Propriétés pour les évolutions
    private int membresEvolutionPourcent = 8;
    private int cotisationsEvolutionPourcent = 15;
    private String objectifCotisations = "15,000,000";
    private int aidesApprouvees = 12;
    private int membresParticipants = 189;
    
    // Propriétés pour le graphique
    private String periodeGraph = "3M";
    private String filtreActivite = "ALL";
    
    // Propriétés pour les cotisations
    private int cotisationsAJour = 60;
    private int cotisationsRetardPourcent = 20;
    private int cotisationsImpayees = 20;
    
    // Propriétés pour les tâches prioritaires
    private int adhesionsPendantes = 5;
    private int aidesEnAttente = 7;
    private int evenementsAPlanifier = 2;
    
    // Propriétés financières
    private Date moisSelectionne = new Date();
    private String recettesMois = "4,250,000";
    private String depensesMois = "1,800,000";
    private String soldeMois = "2,450,000";
    private String tresorerie = "18,750,000";
    
    // Date actuelle
    private String currentDate;
    
    // Propriétés manquantes pour les barres de progression
    private int tauxActivite = 75;
    private int tauxObjectifCotisations = 82;
    private int tauxAidesTraitees = 68;
    private int tauxEngagement = 89;
    private int tachesCompletees = 23;
    private boolean hasAlerts = true;
    
    public DashboardBean() {
        this.currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
    }
    
    // Getters et Setters complets
    public int getActiveMembers() { return activeMembers; }
    public void setActiveMembers(int activeMembers) { this.activeMembers = activeMembers; }
    
    public String getTotalCotisations() { return totalCotisations; }
    public void setTotalCotisations(String totalCotisations) { this.totalCotisations = totalCotisations; }
    
    public int getPendingAides() { return pendingAides; }
    public void setPendingAides(int pendingAides) { this.pendingAides = pendingAides; }
    
    public int getUpcomingEvents() { return upcomingEvents; }
    public void setUpcomingEvents(int upcomingEvents) { this.upcomingEvents = upcomingEvents; }
    
    public int getTotalMembers() { return totalMembers; }
    public void setTotalMembers(int totalMembers) { this.totalMembers = totalMembers; }
    
    public String getAidesDistribuees() { return aidesDistribuees; }
    public void setAidesDistribuees(String aidesDistribuees) { this.aidesDistribuees = aidesDistribuees; }
    
    public int getTauxParticipation() { return tauxParticipation; }
    public void setTauxParticipation(int tauxParticipation) { this.tauxParticipation = tauxParticipation; }
    
    public int getCotisationsRetard() { return cotisationsRetard; }
    public void setCotisationsRetard(int cotisationsRetard) { this.cotisationsRetard = cotisationsRetard; }
    
    public int getAdhesionsExpiration() { return adhesionsExpiration; }
    public void setAdhesionsExpiration(int adhesionsExpiration) { this.adhesionsExpiration = adhesionsExpiration; }
    
    public int getDemandesToTraiter() { return demandesToTraiter; }
    public void setDemandesToTraiter(int demandesToTraiter) { this.demandesToTraiter = demandesToTraiter; }
    
    public int getTachesFinaliser() { return tachesFinaliser; }
    public void setTachesFinaliser(int tachesFinaliser) { this.tachesFinaliser = tachesFinaliser; }
    
    public int getMembresEvolutionPourcent() { return membresEvolutionPourcent; }
    public void setMembresEvolutionPourcent(int membresEvolutionPourcent) { this.membresEvolutionPourcent = membresEvolutionPourcent; }
    
    public int getCotisationsEvolutionPourcent() { return cotisationsEvolutionPourcent; }
    public void setCotisationsEvolutionPourcent(int cotisationsEvolutionPourcent) { this.cotisationsEvolutionPourcent = cotisationsEvolutionPourcent; }
    
    public String getObjectifCotisations() { return objectifCotisations; }
    public void setObjectifCotisations(String objectifCotisations) { this.objectifCotisations = objectifCotisations; }
    
    public int getAidesApprouvees() { return aidesApprouvees; }
    public void setAidesApprouvees(int aidesApprouvees) { this.aidesApprouvees = aidesApprouvees; }
    
    public int getMembresParticipants() { return membresParticipants; }
    public void setMembresParticipants(int membresParticipants) { this.membresParticipants = membresParticipants; }
    
    public String getPeriodeGraph() { return periodeGraph; }
    public void setPeriodeGraph(String periodeGraph) { this.periodeGraph = periodeGraph; }
    
    public String getFiltreActivite() { return filtreActivite; }
    public void setFiltreActivite(String filtreActivite) { this.filtreActivite = filtreActivite; }
    
    public int getCotisationsAJour() { return cotisationsAJour; }
    public void setCotisationsAJour(int cotisationsAJour) { this.cotisationsAJour = cotisationsAJour; }
    
    public int getCotisationsRetardPourcent() { return cotisationsRetardPourcent; }
    public void setCotisationsRetardPourcent(int cotisationsRetardPourcent) { this.cotisationsRetardPourcent = cotisationsRetardPourcent; }
    
    public int getCotisationsImpayees() { return cotisationsImpayees; }
    public void setCotisationsImpayees(int cotisationsImpayees) { this.cotisationsImpayees = cotisationsImpayees; }
    
    public int getAdhesionsPendantes() { return adhesionsPendantes; }
    public void setAdhesionsPendantes(int adhesionsPendantes) { this.adhesionsPendantes = adhesionsPendantes; }
    
    public int getAidesEnAttente() { return aidesEnAttente; }
    public void setAidesEnAttente(int aidesEnAttente) { this.aidesEnAttente = aidesEnAttente; }
    
    public int getEvenementsAPlanifier() { return evenementsAPlanifier; }
    public void setEvenementsAPlanifier(int evenementsAPlanifier) { this.evenementsAPlanifier = evenementsAPlanifier; }
    
    public Date getMoisSelectionne() { return moisSelectionne; }
    public void setMoisSelectionne(Date moisSelectionne) { this.moisSelectionne = moisSelectionne; }
    
    public String getRecettesMois() { return recettesMois; }
    public void setRecettesMois(String recettesMois) { this.recettesMois = recettesMois; }
    
    public String getDepensesMois() { return depensesMois; }
    public void setDepensesMois(String depensesMois) { this.depensesMois = depensesMois; }
    
    public String getSoldeMois() { return soldeMois; }
    public void setSoldeMois(String soldeMois) { this.soldeMois = soldeMois; }
    
    public String getTresorerie() { return tresorerie; }
    public void setTresorerie(String tresorerie) { this.tresorerie = tresorerie; }
    
    public String getCurrentDate() { return currentDate; }
    public void setCurrentDate(String currentDate) { this.currentDate = currentDate; }
    
    public int getTauxActivite() { return tauxActivite; }
    public void setTauxActivite(int tauxActivite) { this.tauxActivite = tauxActivite; }
    
    public int getTauxObjectifCotisations() { return tauxObjectifCotisations; }
    public void setTauxObjectifCotisations(int tauxObjectifCotisations) { this.tauxObjectifCotisations = tauxObjectifCotisations; }
    
    public int getTauxAidesTraitees() { return tauxAidesTraitees; }
    public void setTauxAidesTraitees(int tauxAidesTraitees) { this.tauxAidesTraitees = tauxAidesTraitees; }
    
    public int getTauxEngagement() { return tauxEngagement; }
    public void setTauxEngagement(int tauxEngagement) { this.tauxEngagement = tauxEngagement; }
    
    public int getTachesCompletees() { return tachesCompletees; }
    public void setTachesCompletees(int tachesCompletees) { this.tachesCompletees = tachesCompletees; }
    
    public boolean isHasAlerts() { return hasAlerts; }
    public void setHasAlerts(boolean hasAlerts) { this.hasAlerts = hasAlerts; }
    
    // Méthodes pour les activités récentes
    public List<Activity> getRecentActivities() {
        List<Activity> activities = new ArrayList<>();
        
        activities.add(new Activity(
            LocalDateTime.now().minusHours(2),
            "COTISATION",
            "success",
            "pi pi-check-circle",
            "Paiement cotisation validé",
            "Cotisation de Fatou Sow pour juillet 2024",
            "25,000",
            "Fatou Sow",
            "Membre"
        ));
        
        activities.add(new Activity(
            LocalDateTime.now().minusHours(5),
            "ADHESION",
            "info",
            "pi pi-user-plus",
            "Nouvelle demande d'adhésion",
            "Demande soumise par Moussa Ba",
            null,
            "Moussa Ba",
            "Candidat"
        ));
        
        activities.add(new Activity(
            LocalDateTime.now().minusHours(8),
            "AIDE",
            "warning",
            "pi pi-heart",
            "Demande d'aide en traitement",
            "Aide médicale pour famille Ndiaye",
            "150,000",
            "Aminata Ndiaye",
            "Membre"
        ));
        
        activities.add(new Activity(
            LocalDateTime.now().minusDays(1),
            "EVENEMENT",
            "info",
            "pi pi-calendar",
            "Événement planifié",
            "Assemblée générale mensuelle programmée",
            null,
            "Admin",
            "Administrateur"
        ));
        
        activities.add(new Activity(
            LocalDateTime.now().minusDays(1).minusHours(3),
            "COTISATION",
            "danger",
            "pi pi-exclamation-triangle",
            "Relance envoyée",
            "Relance automatique pour cotisation en retard",
            null,
            "Système",
            "Automatique"
        ));
        
        return activities;
    }
    
    // Actions de navigation
    public String redirectToNewMember() {
        return "/pages/secure/membre/inscription?faces-redirect=true";
    }
    
    public String redirectToCotisation() {
        return "/pages/secure/cotisation/paiement?faces-redirect=true";
    }
    
    public String redirectToEvenement() {
        return "/pages/secure/evenement/creation?faces-redirect=true";
    }
    
    public String redirectToAdhesionValidation() {
        return "/pages/secure/adhesion/validation?faces-redirect=true";
    }
    
    public String redirectToRelances() {
        return "/pages/secure/cotisation/relances?faces-redirect=true";
    }
    
    public String redirectToAidesTraitement() {
        return "/pages/secure/aide/traitement?faces-redirect=true";
    }
    
    public String redirectToEvenementPlanning() {
        return "/pages/secure/evenement/gestion?faces-redirect=true";
    }
    
    public void generateRapport() {
        // Logique de génération de rapport
    }
    
    public void exportFinancialReport() {
        // Logique d'export du rapport financier
    }
    
    public void onMoisChange() {
        // Logique de mise à jour lors du changement de mois
    }
    
    // Classe interne pour les activités enrichie
    public static class Activity implements Serializable {
        private LocalDateTime date;
        private String type;
        private String severity;
        private String icon;
        private String titre;
        private String description;
        private String montant;
        private String userNom;
        private String userRole;
        
        public Activity(LocalDateTime date, String type, String severity, String icon, 
                       String titre, String description, String montant, String userNom, String userRole) {
            this.date = date;
            this.type = type;
            this.severity = severity;
            this.icon = icon;
            this.titre = titre;
            this.description = description;
            this.montant = montant;
            this.userNom = userNom;
            this.userRole = userRole;
        }
        
        // Getters et setters
        public LocalDateTime getDate() { return date; }
        public void setDate(LocalDateTime date) { this.date = date; }
        
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getSeverity() { return severity; }
        public void setSeverity(String severity) { this.severity = severity; }
        
        public String getIcon() { return icon; }
        public void setIcon(String icon) { this.icon = icon; }
        
        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 getMontant() { return montant; }
        public void setMontant(String montant) { this.montant = montant; }
        
        public String getUserNom() { return userNom; }
        public void setUserNom(String userNom) { this.userNom = userNom; }
        
        public String getUserRole() { return userRole; }
        public void setUserRole(String userRole) { this.userRole = userRole; }
    }
}