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

@Named("membreDashboardBean")
@SessionScoped
public class MembreDashboardBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // Constantes de navigation outcomes (WOU/DRY - réutilisables)
    private static final String OUTCOME_MEMBRE_EVENEMENT = "membreEvenementPage";
    private static final String OUTCOME_MEMBRE_COTISATIONS = "membreCotisationsPage";
    
    // Membre actuel
    private Membre membre;
    
    // Statistiques
    private String statutCotisations;
    private int evenementsInscrits;
    private int aidesRecues;
    private int messagesNonLus;
    
    // Progression
    private int cotisationsPayees;
    private int cotisationsTotales;
    private int progressionCotisations;
    private int tauxParticipation;
    private int evenementsAssistes;
    private String anciennete;
    private String dateAdhesionFormatee;
    
    // Listes
    private List<Alerte> alertes = new ArrayList<>();
    private List<Evenement> prochainsEvenements = new ArrayList<>();
    private List<Rappel> rappels = new ArrayList<>();
    private List<Activite> activiteRecente = new ArrayList<>();
    
    // État
    private boolean peutPayerCotisations;
    
    @PostConstruct
    public void init() {
        initializeMembre();
        initializeStatistiques();
        initializeAlertes();
        initializeEvenements();
        initializeRappels();
        initializeActivite();
    }
    
    private void initializeMembre() {
        membre = new Membre();
        membre.setPrenom("Jean");
        membre.setNom("Dupont");
        membre.setNumeroMembre("M240001");
        membre.setTypeMembre("Membre Actif");
        membre.setDateAdhesion("15/06/2020");
        membre.setPhotoUrl(null); // Pas de photo par défaut
    }
    
    private void initializeStatistiques() {
        this.statutCotisations = "À jour";
        this.evenementsInscrits = 3;
        this.aidesRecues = 2;
        this.messagesNonLus = 5;
        this.cotisationsPayees = 10;
        this.cotisationsTotales = 12;
        this.progressionCotisations = 83;
        this.tauxParticipation = 75;
        this.evenementsAssistes = 15;
        this.anciennete = "4 ans";
        this.dateAdhesionFormatee = "15 juin 2020";
        this.peutPayerCotisations = true;
    }
    
    private void initializeAlertes() {
        Alerte alerte1 = new Alerte();
        alerte1.setTitre("Cotisation de décembre");
        alerte1.setMessage("Votre cotisation mensuelle de décembre est due le 15/12/2024");
        alerte1.setDateRelative("Il y a 2 jours");
        alerte1.setIcone("pi-dollar");
        alerte1.setCouleurIcone("text-orange-500");
        alerte1.setCouleurFond("rgba(255, 193, 7, 0.1)");
        alerte1.setCouleurBordure("border-orange-500");
        alertes.add(alerte1);
        
        Alerte alerte2 = new Alerte();
        alerte2.setTitre("Nouvel événement");
        alerte2.setMessage("Assemblée générale prévue le 28 décembre 2024");
        alerte2.setDateRelative("Hier");
        alerte2.setIcone("pi-calendar");
        alerte2.setCouleurIcone("text-blue-500");
        alerte2.setCouleurFond("rgba(13, 110, 253, 0.1)");
        alerte2.setCouleurBordure("border-blue-500");
        alertes.add(alerte2);
    }
    
    private void initializeEvenements() {
        Evenement event1 = new Evenement();
        event1.setTitre("Assemblée Générale Ordinaire");
        event1.setDateComplete("Samedi 28 décembre 2024 - 09h00");
        event1.setLieu("Siège de l'association");
        event1.setPrixFormate("Gratuit");
        event1.setNombreParticipants("45 inscrits");
        event1.setStatutInscription("Inscrit");
        event1.setSeverityInscription("success");
        event1.setIconeType("pi-users");
        event1.setCouleurCategorie("bg-blue-500");
        event1.setCouleurBordure("border-blue-500");
        event1.setPeutAnnuler(true);
        prochainsEvenements.add(event1);
        
        Evenement event2 = new Evenement();
        event2.setTitre("Formation premiers secours");
        event2.setDateComplete("Dimanche 15 janvier 2025 - 14h00");
        event2.setLieu("Centre de formation");
        event2.setPrixFormate("2,500 FCFA");
        event2.setNombreParticipants("12 inscrits");
        event2.setStatutInscription("En attente");
        event2.setSeverityInscription("warning");
        event2.setIconeType("pi-heart");
        event2.setCouleurCategorie("bg-red-500");
        event2.setCouleurBordure("border-red-500");
        event2.setPeutAnnuler(false);
        prochainsEvenements.add(event2);
    }
    
    private void initializeRappels() {
        Rappel rappel1 = new Rappel();
        rappel1.setTitre("Cotisation décembre");
        rappel1.setEcheance("Dans 3 jours");
        rappel1.setIcone("pi-dollar");
        rappel1.setCouleurIcone("text-orange-500");
        rappel1.setCouleurFond("surface-100");
        rappels.add(rappel1);
        
        Rappel rappel2 = new Rappel();
        rappel2.setTitre("Renouvellement adhésion");
        rappel2.setEcheance("Dans 2 mois");
        rappel2.setIcone("pi-id-card");
        rappel2.setCouleurIcone("text-blue-500");
        rappel2.setCouleurFond("surface-100");
        rappels.add(rappel2);
    }
    
    private void initializeActivite() {
        Activite activite1 = new Activite();
        activite1.setTitre("Cotisation payée");
        activite1.setDescription("Cotisation de novembre 2024 - 5,000 FCFA");
        activite1.setDateRelative("Il y a 5 jours");
        activite1.setIcone("pi-check");
        activite1.setCouleurCategorie("bg-green-500");
        activiteRecente.add(activite1);
        
        Activite activite2 = new Activite();
        activite2.setTitre("Participation événement");
        activite2.setDescription("Sortie culturelle au musée");
        activite2.setDateRelative("Il y a 1 semaine");
        activite2.setIcone("pi-calendar");
        activite2.setCouleurCategorie("bg-blue-500");
        activiteRecente.add(activite2);
        
        Activite activite3 = new Activite();
        activite3.setTitre("Inscription événement");
        activite3.setDescription("Assemblée générale ordinaire");
        activite3.setDateRelative("Il y a 2 semaines");
        activite3.setIcone("pi-user-plus");
        activite3.setCouleurCategorie("bg-purple-500");
        activiteRecente.add(activite3);
    }
    
    // Actions
    public void marquerLue(Alerte alerte) {
        alertes.remove(alerte);
    }
    
    public String voirEvenement(Evenement evenement) {
        // Utilisation de navigation outcome au lieu de chemin direct (WOU/DRY)
        return OUTCOME_MEMBRE_EVENEMENT + "?id=" + evenement.getTitre() + "&faces-redirect=true";
    }
    
    public void annulerInscription(Evenement evenement) {
        evenement.setStatutInscription("Annulé");
        evenement.setSeverityInscription("danger");
        evenement.setPeutAnnuler(false);
    }
    
    public String payerCotisations() {
        // Utilisation de navigation outcome au lieu de chemin direct (WOU/DRY)
        return OUTCOME_MEMBRE_COTISATIONS + "?faces-redirect=true";
    }
    
    // Getters et Setters
    public Membre getMembre() { return membre; }
    public void setMembre(Membre membre) { this.membre = membre; }
    
    public String getStatutCotisations() { return statutCotisations; }
    public void setStatutCotisations(String statutCotisations) { this.statutCotisations = statutCotisations; }
    
    public int getEvenementsInscrits() { return evenementsInscrits; }
    public void setEvenementsInscrits(int evenementsInscrits) { this.evenementsInscrits = evenementsInscrits; }
    
    public int getAidesRecues() { return aidesRecues; }
    public void setAidesRecues(int aidesRecues) { this.aidesRecues = aidesRecues; }
    
    public int getMessagesNonLus() { return messagesNonLus; }
    public void setMessagesNonLus(int messagesNonLus) { this.messagesNonLus = messagesNonLus; }
    
    public int getCotisationsPayees() { return cotisationsPayees; }
    public void setCotisationsPayees(int cotisationsPayees) { this.cotisationsPayees = cotisationsPayees; }
    
    public int getCotisationsTotales() { return cotisationsTotales; }
    public void setCotisationsTotales(int cotisationsTotales) { this.cotisationsTotales = cotisationsTotales; }
    
    public int getProgressionCotisations() { return progressionCotisations; }
    public void setProgressionCotisations(int progressionCotisations) { this.progressionCotisations = progressionCotisations; }
    
    public int getTauxParticipation() { return tauxParticipation; }
    public void setTauxParticipation(int tauxParticipation) { this.tauxParticipation = tauxParticipation; }
    
    public int getEvenementsAssistes() { return evenementsAssistes; }
    public void setEvenementsAssistes(int evenementsAssistes) { this.evenementsAssistes = evenementsAssistes; }
    
    public String getAnciennete() { return anciennete; }
    public void setAnciennete(String anciennete) { this.anciennete = anciennete; }
    
    public String getDateAdhesionFormatee() { return dateAdhesionFormatee; }
    public void setDateAdhesionFormatee(String dateAdhesionFormatee) { this.dateAdhesionFormatee = dateAdhesionFormatee; }
    
    public List<Alerte> getAlertes() { return alertes; }
    public void setAlertes(List<Alerte> alertes) { this.alertes = alertes; }
    
    public List<Evenement> getProchainsEvenements() { return prochainsEvenements; }
    public void setProchainsEvenements(List<Evenement> prochainsEvenements) { this.prochainsEvenements = prochainsEvenements; }
    
    public List<Rappel> getRappels() { return rappels; }
    public void setRappels(List<Rappel> rappels) { this.rappels = rappels; }
    
    public List<Activite> getActiviteRecente() { return activiteRecente; }
    public void setActiviteRecente(List<Activite> activiteRecente) { this.activiteRecente = activiteRecente; }
    
    public boolean isPeutPayerCotisations() { return peutPayerCotisations; }
    public void setPeutPayerCotisations(boolean peutPayerCotisations) { this.peutPayerCotisations = peutPayerCotisations; }
    
    // Classes internes
    public static class Membre {
        private String prenom;
        private String nom;
        private String numeroMembre;
        private String typeMembre;
        private String dateAdhesion;
        private String photoUrl;
        
        public String getPrenom() { return prenom; }
        public void setPrenom(String prenom) { this.prenom = prenom; }
        
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public String getNumeroMembre() { return numeroMembre; }
        public void setNumeroMembre(String numeroMembre) { this.numeroMembre = numeroMembre; }
        
        public String getTypeMembre() { return typeMembre; }
        public void setTypeMembre(String typeMembre) { this.typeMembre = typeMembre; }
        
        public String getDateAdhesion() { return dateAdhesion; }
        public void setDateAdhesion(String dateAdhesion) { this.dateAdhesion = dateAdhesion; }
        
        public String getPhotoUrl() { return photoUrl; }
        public void setPhotoUrl(String photoUrl) { this.photoUrl = photoUrl; }
        
        public String getInitiales() {
            return (prenom != null ? prenom.substring(0, 1) : "") + 
                   (nom != null ? nom.substring(0, 1) : "");
        }
    }
    
    public static class Alerte {
        private String titre;
        private String message;
        private String dateRelative;
        private String icone;
        private String couleurIcone;
        private String couleurFond;
        private String couleurBordure;
        
        // Getters et setters
        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }
        
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
        
        public String getDateRelative() { return dateRelative; }
        public void setDateRelative(String dateRelative) { this.dateRelative = dateRelative; }
        
        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }
        
        public String getCouleurIcone() { return couleurIcone; }
        public void setCouleurIcone(String couleurIcone) { this.couleurIcone = couleurIcone; }
        
        public String getCouleurFond() { return couleurFond; }
        public void setCouleurFond(String couleurFond) { this.couleurFond = couleurFond; }
        
        public String getCouleurBordure() { return couleurBordure; }
        public void setCouleurBordure(String couleurBordure) { this.couleurBordure = couleurBordure; }
    }
    
    public static class Evenement {
        private String titre;
        private String dateComplete;
        private String lieu;
        private String prixFormate;
        private String nombreParticipants;
        private String statutInscription;
        private String severityInscription;
        private String iconeType;
        private String couleurCategorie;
        private String couleurBordure;
        private boolean peutAnnuler;
        
        // Getters et setters
        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }
        
        public String getDateComplete() { return dateComplete; }
        public void setDateComplete(String dateComplete) { this.dateComplete = dateComplete; }
        
        public String getLieu() { return lieu; }
        public void setLieu(String lieu) { this.lieu = lieu; }
        
        public String getPrixFormate() { return prixFormate; }
        public void setPrixFormate(String prixFormate) { this.prixFormate = prixFormate; }
        
        public String getNombreParticipants() { return nombreParticipants; }
        public void setNombreParticipants(String nombreParticipants) { this.nombreParticipants = nombreParticipants; }
        
        public String getStatutInscription() { return statutInscription; }
        public void setStatutInscription(String statutInscription) { this.statutInscription = statutInscription; }
        
        public String getSeverityInscription() { return severityInscription; }
        public void setSeverityInscription(String severityInscription) { this.severityInscription = severityInscription; }
        
        public String getIconeType() { return iconeType; }
        public void setIconeType(String iconeType) { this.iconeType = iconeType; }
        
        public String getCouleurCategorie() { return couleurCategorie; }
        public void setCouleurCategorie(String couleurCategorie) { this.couleurCategorie = couleurCategorie; }
        
        public String getCouleurBordure() { return couleurBordure; }
        public void setCouleurBordure(String couleurBordure) { this.couleurBordure = couleurBordure; }
        
        public boolean isPeutAnnuler() { return peutAnnuler; }
        public void setPeutAnnuler(boolean peutAnnuler) { this.peutAnnuler = peutAnnuler; }
        
        public String getCouleurPrix() {
            return prixFormate.equals("Gratuit") ? "text-green-500" : "text-blue-500";
        }
    }
    
    public static class Rappel {
        private String titre;
        private String echeance;
        private String icone;
        private String couleurIcone;
        private String couleurFond;
        
        // Getters et setters
        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }
        
        public String getEcheance() { return echeance; }
        public void setEcheance(String echeance) { this.echeance = echeance; }
        
        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }
        
        public String getCouleurIcone() { return couleurIcone; }
        public void setCouleurIcone(String couleurIcone) { this.couleurIcone = couleurIcone; }
        
        public String getCouleurFond() { return couleurFond; }
        public void setCouleurFond(String couleurFond) { this.couleurFond = couleurFond; }
    }
    
    public static class Activite {
        private String titre;
        private String description;
        private String dateRelative;
        private String icone;
        private String couleurCategorie;
        
        // 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 getDateRelative() { return dateRelative; }
        public void setDateRelative(String dateRelative) { this.dateRelative = dateRelative; }
        
        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }
        
        public String getCouleurCategorie() { return couleurCategorie; }
        public void setCouleurCategorie(String couleurCategorie) { this.couleurCategorie = couleurCategorie; }
    }
}