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

@Named("superAdminBean")
@SessionScoped
public class SuperAdminBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private String nomComplet;
    private String derniereConnexion;
    private int totalEntites;
    private int totalAdministrateurs;
    private int totalMembres;
    private String revenusGlobaux;
    private int alertesCount;
    private String croissanceEntites;
    private int activiteJournaliere;
    
    // Métriques de souscription
    private int totalSouscriptions;
    private int souscriptionsActives;
    private int souscriptionsExpirantSous30Jours;
    private float tauxConversion;
    
    // Revenus par forfait
    private BigDecimal revenusStarter = BigDecimal.ZERO;
    private BigDecimal revenusStandard = BigDecimal.ZERO;
    private BigDecimal revenusPremmium = BigDecimal.ZERO;
    private BigDecimal revenusCristal = BigDecimal.ZERO;
    
    // Métriques système
    private float disponibiliteSysteme;
    private int tempsReponsMoyen;
    private int ticketsSupportOuverts;
    private float satisfactionClient;
    
    private List<Alerte> alertesRecentes;
    private List<Entite> topEntites;
    private List<TypeEntite> repartitionTypes;
    private List<Activite> activitesRecentes;
    private List<EvolutionMois> evolutionEntites;
    private RevenusData revenus;
    private String periodeEvolution = "12M";
    
    @PostConstruct
    public void init() {
        initializeUserInfo();
        initializeKPIs();
        initializeAlertes();
        initializeEntites();
        initializeRepartitionTypes();
        initializeActivites();
        initializeEvolution();
        initializeRevenus();
    }
    
    private void initializeUserInfo() {
        nomComplet = "Administrateur Système";
        derniereConnexion = LocalDateTime.now().minusHours(2).format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"));
    }
    
    private void initializeKPIs() {
        totalEntites = 127; // Ajusté avec la stratégie volume
        totalAdministrateurs = 127;
        totalMembres = 18547; // Moyenne 146 membres par entité
        revenusGlobaux = "363 000 FCFA";
        alertesCount = 8;
        croissanceEntites = "12";
        activiteJournaliere = 1247;
        
        // Initialiser les métriques de souscription
        totalSouscriptions = 127;
        souscriptionsActives = 127;
        souscriptionsExpirantSous30Jours = 12;
        tauxConversion = 68.5f;
        
        // Revenus par forfait - nouvelle grille tarifaire
        revenusStarter = new BigDecimal("88000"); // 44 organisations * 2000 FCFA
        revenusStandard = new BigDecimal("180000"); // 60 organisations * 3000 FCFA
        revenusPremmium = new BigDecimal("80000"); // 20 organisations * 4000 FCFA
        revenusCristal = new BigDecimal("15000"); // 3 organisations * 5000 FCFA
        
        // Métriques système
        disponibiliteSysteme = 99.8f;
        tempsReponsMoyen = 145; // ms
        ticketsSupportOuverts = 8;
        satisfactionClient = 4.7f; // /5
    }
    
    private void initializeAlertes() {
        alertesRecentes = new ArrayList<>();
        
        // Alertes critiques de souscription
        Alerte alerte1 = new Alerte();
        alerte1.setId(1L);
        alerte1.setTitre("12 souscriptions expirent sous 30 jours");
        alerte1.setEntite("Système - Souscriptions");
        alerte1.setDate("Aujourd'hui");
        alerte1.setIcone("pi-clock");
        alerte1.setCouleur("text-red-500");
        alertesRecentes.add(alerte1);
        
        Alerte alerte2 = new Alerte();
        alerte2.setId(2L);
        alerte2.setTitre("Quota membre atteint");
        alerte2.setEntite("Club Sportif Thiès (Standard)");
        alerte2.setDate("Il y a 2h");
        alerte2.setIcone("pi-users");
        alerte2.setCouleur("text-orange-500");
        alertesRecentes.add(alerte2);
        
        Alerte alerte3 = new Alerte();
        alerte3.setId(3L);
        alerte3.setTitre("Pic d'inscriptions détecté");
        alerte3.setEntite("Association des Femmes Kaolack");
        alerte3.setDate("Il y a 4h");
        alerte3.setIcone("pi-trending-up");
        alerte3.setCouleur("text-green-500");
        alertesRecentes.add(alerte3);
        
        Alerte alerte4 = new Alerte();
        alerte4.setId(4L);
        alerte4.setTitre("Performance système dégradée");
        alerte4.setEntite("Système - Infrastructure");
        alerte4.setDate("Il y a 6h");
        alerte4.setIcone("pi-exclamation-triangle");
        alerte4.setCouleur("text-orange-500");
        alertesRecentes.add(alerte4);
        
        Alerte alerte5 = new Alerte();
        alerte5.setId(5L);
        alerte5.setTitre("Demande d'upgrade Premium");
        alerte5.setEntite("Mutuelle Santé Dakar");
        alerte5.setDate("Hier");
        alerte5.setIcone("pi-arrow-up");
        alerte5.setCouleur("text-blue-500");
        alertesRecentes.add(alerte5);
        
        Alerte alerte6 = new Alerte();
        alerte6.setId(6L);
        alerte6.setTitre("8 tickets support en attente");
        alerte6.setEntite("Support Client");
        alerte6.setDate("Il y a 1h");
        alerte6.setIcone("pi-comment");
        alerte6.setCouleur("text-purple-500");
        alertesRecentes.add(alerte6);
    }
    
    private void initializeEntites() {
        topEntites = new ArrayList<>();
        
        String[] noms = {"LIONS CLUB Dakar Métropole", "LIONS CLUB Thiès", "LIONS CLUB Kaolack", "LIONS CLUB Saint-Louis", "LIONS CLUB Ziguinchor"};
        String[] types = {"Club Principal", "Club Régional", "Club Régional", "Club Régional", "Club Régional"};
        int[] membres = {156, 123, 98, 87, 73};
        
        for (int i = 0; i < 5; i++) {
            Entite entite = new Entite();
            entite.setId((long) (i + 1));
            entite.setNom(noms[i]);
            entite.setTypeEntite(types[i]);
            entite.setNombreMembres(membres[i]);
            topEntites.add(entite);
        }
    }
    
    private void initializeRepartitionTypes() {
        repartitionTypes = new ArrayList<>();
        
        TypeEntite clubs = new TypeEntite();
        clubs.setNom("Clubs Lions");
        clubs.setDescription("Clubs traditionnels");
        clubs.setNombre(12);
        clubs.setPourcentage(80);
        clubs.setIcone("pi-users");
        clubs.setCouleurBg("bg-blue-100");
        clubs.setCouleurTexte("text-blue-500");
        repartitionTypes.add(clubs);
        
        TypeEntite branches = new TypeEntite();
        branches.setNom("Branches");
        branches.setDescription("Branches spécialisées");
        branches.setNombre(2);
        branches.setPourcentage(13);
        branches.setIcone("pi-sitemap");
        branches.setCouleurBg("bg-green-100");
        branches.setCouleurTexte("text-green-500");
        repartitionTypes.add(branches);
        
        TypeEntite leos = new TypeEntite();
        leos.setNom("LEO Clubs");
        leos.setDescription("Clubs jeunes");
        leos.setNombre(1);
        leos.setPourcentage(7);
        leos.setIcone("pi-star");
        leos.setCouleurBg("bg-orange-100");
        leos.setCouleurTexte("text-orange-500");
        repartitionTypes.add(leos);
    }
    
    private void initializeActivites() {
        activitesRecentes = new ArrayList<>();
        
        String[] descriptions = {
            "Nouvelle entité créée",
            "Paiement de cotisation validé",
            "Membre suspendu",
            "Rapport mensuel généré",
            "Configuration mise à jour"
        };
        
        String[] entites = {
            "LIONS CLUB Fatick",
            "LIONS CLUB Dakar",
            "LIONS CLUB Thiès",
            "Système",
            "Administration"
        };
        
        String[] icones = {
            "pi-plus",
            "pi-check",
            "pi-ban",
            "pi-chart-bar",
            "pi-cog"
        };
        
        String[] utilisateurs = {
            "Admin Fatick",
            "Jean DIALLO",
            "Admin Thiès",
            "Système",
            "Super Admin"
        };
        
        for (int i = 0; i < 5; i++) {
            Activite activite = new Activite();
            activite.setId((long) (i + 1));
            activite.setDescription(descriptions[i]);
            activite.setEntite(entites[i]);
            activite.setIcone(icones[i]);
            activite.setDate(LocalDateTime.now().minusHours(i * 2).format(DateTimeFormatter.ofPattern("dd/MM HH:mm")));
            activite.setUtilisateur(utilisateurs[i]);
            if (i == 1) {
                activite.setDetails("Montant: 15 000 FCFA via Wave Money");
            }
            if (i == 2) {
                activite.setDetails("Motif: Non-paiement des cotisations");
            }
            activitesRecentes.add(activite);
        }
    }
    
    private void initializeEvolution() {
        evolutionEntites = new ArrayList<>();
        
        String[] periodes = {"Jan", "Fév", "Mar", "Avr", "Mai", "Jun"};
        int[] valeurs = {10, 11, 12, 13, 14, 15};
        
        for (int i = 0; i < 6; i++) {
            EvolutionMois mois = new EvolutionMois();
            mois.setPeriode(periodes[i]);
            mois.setValeur(valeurs[i]);
            mois.setHauteur(30 + (valeurs[i] * 8)); // Calcul hauteur pour graphique
            evolutionEntites.add(mois);
        }
    }
    
    private void initializeRevenus() {
        revenus = new RevenusData();
        revenus.setMensuel("425 000 FCFA");
        revenus.setAnnuel("2 450 000 FCFA");
        revenus.setCroissance("15.5");
        revenus.setMoyenne("163 333 FCFA");
        revenus.setCroissanceMensuelle("8.2");
        revenus.setObjectifAnnuel("3 000 000 FCFA");
        revenus.setDerniereMAJ(LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));
        
        // Évolution des revenus
        List<MoisRevenu> evolution = new ArrayList<>();
        String[] mois = {"Jan", "Fév", "Mar", "Avr", "Mai", "Jun"};
        int[] hauteurs = {60, 75, 90, 85, 95, 100};
        String[] valeurs = {"380K", "420K", "465K", "445K", "485K", "500K"};
        
        for (int i = 0; i < 6; i++) {
            MoisRevenu moisRevenu = new MoisRevenu();
            moisRevenu.setNom(mois[i]);
            moisRevenu.setHauteur(hauteurs[i]);
            moisRevenu.setValeur(valeurs[i]);
            evolution.add(moisRevenu);
        }
        revenus.setEvolution(evolution);
    }
    
    // Actions
    public String creerEntite() {
        return "/pages/super-admin/entites/nouvelle?faces-redirect=true";
    }
    
    public String gererEntites() {
        return "/pages/super-admin/entites/gestion?faces-redirect=true";
    }
    
    public String genererRapport() {
        return "/pages/super-admin/rapports?faces-redirect=true";
    }
    
    public String configurer() {
        return "/pages/super-admin/configuration?faces-redirect=true";
    }
    
    public void voirAlerte(Alerte alerte) {
        System.out.println("Voir alerte: " + alerte.getTitre());
    }
    
    public String voirToutesAlertes() {
        return "/pages/super-admin/alertes?faces-redirect=true";
    }
    
    public String voirTouteActivite() {
        return "/pages/super-admin/activite?faces-redirect=true";
    }
    
    public void exporterRapportFinancier() {
        System.out.println("Export du rapport financier généré");
    }
    
    // Getters et Setters
    public String getNomComplet() { return nomComplet; }
    public void setNomComplet(String nomComplet) { this.nomComplet = nomComplet; }
    
    public String getDerniereConnexion() { return derniereConnexion; }
    public void setDerniereConnexion(String derniereConnexion) { this.derniereConnexion = derniereConnexion; }
    
    public int getTotalEntites() { return totalEntites; }
    public void setTotalEntites(int totalEntites) { this.totalEntites = totalEntites; }
    
    public int getTotalAdministrateurs() { return totalAdministrateurs; }
    public void setTotalAdministrateurs(int totalAdministrateurs) { this.totalAdministrateurs = totalAdministrateurs; }
    
    public int getTotalMembres() { return totalMembres; }
    public void setTotalMembres(int totalMembres) { this.totalMembres = totalMembres; }
    
    public String getRevenusGlobaux() { return revenusGlobaux; }
    public void setRevenusGlobaux(String revenusGlobaux) { this.revenusGlobaux = revenusGlobaux; }
    
    public int getAlertesCount() { return alertesCount; }
    public void setAlertesCount(int alertesCount) { this.alertesCount = alertesCount; }
    
    public String getCroissanceEntites() { return croissanceEntites; }
    public void setCroissanceEntites(String croissanceEntites) { this.croissanceEntites = croissanceEntites; }
    
    public int getActiviteJournaliere() { return activiteJournaliere; }
    public void setActiviteJournaliere(int activiteJournaliere) { this.activiteJournaliere = activiteJournaliere; }
    
    // Getters pour les nouvelles métriques
    public int getTotalSouscriptions() { return totalSouscriptions; }
    public void setTotalSouscriptions(int totalSouscriptions) { this.totalSouscriptions = totalSouscriptions; }
    
    public int getSouscriptionsActives() { return souscriptionsActives; }
    public void setSouscriptionsActives(int souscriptionsActives) { this.souscriptionsActives = souscriptionsActives; }
    
    public int getSouscriptionsExpirantSous30Jours() { return souscriptionsExpirantSous30Jours; }
    public void setSouscriptionsExpirantSous30Jours(int souscriptionsExpirantSous30Jours) { this.souscriptionsExpirantSous30Jours = souscriptionsExpirantSous30Jours; }
    
    public float getTauxConversion() { return tauxConversion; }
    public void setTauxConversion(float tauxConversion) { this.tauxConversion = tauxConversion; }
    
    public BigDecimal getRevenusStarter() { return revenusStarter; }
    public void setRevenusStarter(BigDecimal revenusStarter) { this.revenusStarter = revenusStarter; }
    
    public BigDecimal getRevenusStandard() { return revenusStandard; }
    public void setRevenusStandard(BigDecimal revenusStandard) { this.revenusStandard = revenusStandard; }
    
    public BigDecimal getRevenusPremmium() { return revenusPremmium; }
    public void setRevenusPremmium(BigDecimal revenusPremmium) { this.revenusPremmium = revenusPremmium; }
    
    public BigDecimal getRevenusCristal() { return revenusCristal; }
    public void setRevenusCristal(BigDecimal revenusCristal) { this.revenusCristal = revenusCristal; }
    
    public float getDisponibiliteSysteme() { return disponibiliteSysteme; }
    public void setDisponibiliteSysteme(float disponibiliteSysteme) { this.disponibiliteSysteme = disponibiliteSysteme; }
    
    public int getTempsReponsMoyen() { return tempsReponsMoyen; }
    public void setTempsReponsMoyen(int tempsReponsMoyen) { this.tempsReponsMoyen = tempsReponsMoyen; }
    
    public int getTicketsSupportOuverts() { return ticketsSupportOuverts; }
    public void setTicketsSupportOuverts(int ticketsSupportOuverts) { this.ticketsSupportOuverts = ticketsSupportOuverts; }
    
    public float getSatisfactionClient() { return satisfactionClient; }
    public void setSatisfactionClient(float satisfactionClient) { this.satisfactionClient = satisfactionClient; }
    
    // Méthodes utilitaires
    public String getRevenusStarterFormat() {
        return String.format("%,.0f FCFA", revenusStarter);
    }
    
    public String getRevenusStandardFormat() {
        return String.format("%,.0f FCFA", revenusStandard);
    }
    
    public String getRevenusPremmiumFormat() {
        return String.format("%,.0f FCFA", revenusPremmium);
    }
    
    public String getRevenusCristalFormat() {
        return String.format("%,.0f FCFA", revenusCristal);
    }
    
    public String getTauxConversionFormat() {
        return String.format("%.1f%%", tauxConversion);
    }
    
    public String getDisponibiliteSystemeFormat() {
        return String.format("%.1f%%", disponibiliteSysteme);
    }
    
    public String getSatisfactionClientFormat() {
        return String.format("%.1f/5", satisfactionClient);
    }
    
    public List<Alerte> getAlertesRecentes() { return alertesRecentes; }
    public void setAlertesRecentes(List<Alerte> alertesRecentes) { this.alertesRecentes = alertesRecentes; }
    
    public List<Entite> getTopEntites() { return topEntites; }
    public void setTopEntites(List<Entite> topEntites) { this.topEntites = topEntites; }
    
    public List<TypeEntite> getRepartitionTypes() { return repartitionTypes; }
    public void setRepartitionTypes(List<TypeEntite> repartitionTypes) { this.repartitionTypes = repartitionTypes; }
    
    public List<Activite> getActivitesRecentes() { return activitesRecentes; }
    public void setActivitesRecentes(List<Activite> activitesRecentes) { this.activitesRecentes = activitesRecentes; }
    
    public List<EvolutionMois> getEvolutionEntites() { return evolutionEntites; }
    public void setEvolutionEntites(List<EvolutionMois> evolutionEntites) { this.evolutionEntites = evolutionEntites; }
    
    public RevenusData getRevenus() { return revenus; }
    public void setRevenus(RevenusData revenus) { this.revenus = revenus; }
    
    public String getPeriodeEvolution() { return periodeEvolution; }
    public void setPeriodeEvolution(String periodeEvolution) { this.periodeEvolution = periodeEvolution; }
    
    // Classes internes
    public static class Alerte {
        private Long id;
        private String titre;
        private String entite;
        private String date;
        private String icone;
        private String couleur;
        
        // Getters et setters
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
        
        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }
        
        public String getEntite() { return entite; }
        public void setEntite(String entite) { this.entite = entite; }
        
        public String getDate() { return date; }
        public void setDate(String date) { this.date = date; }
        
        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }
        
        public String getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
    }
    
    public static class Entite {
        private Long id;
        private String nom;
        private String typeEntite;
        private int nombreMembres;
        
        // 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 getTypeEntite() { return typeEntite; }
        public void setTypeEntite(String typeEntite) { this.typeEntite = typeEntite; }
        
        public int getNombreMembres() { return nombreMembres; }
        public void setNombreMembres(int nombreMembres) { this.nombreMembres = nombreMembres; }
    }
    
    public static class TypeEntite {
        private String nom;
        private String description;
        private int nombre;
        private int pourcentage;
        private String icone;
        private String couleurBg;
        private String couleurTexte;
        
        // Getters et setters
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public int getNombre() { return nombre; }
        public void setNombre(int nombre) { this.nombre = nombre; }
        
        public int getPourcentage() { return pourcentage; }
        public void setPourcentage(int pourcentage) { this.pourcentage = pourcentage; }
        
        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }
        
        public String getCouleurBg() { return couleurBg; }
        public void setCouleurBg(String couleurBg) { this.couleurBg = couleurBg; }
        
        public String getCouleurTexte() { return couleurTexte; }
        public void setCouleurTexte(String couleurTexte) { this.couleurTexte = couleurTexte; }
    }
    
    public static class Activite {
        private Long id;
        private String description;
        private String entite;
        private String date;
        private String icone;
        private String utilisateur;
        private String details;
        
        // Getters et setters
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public String getEntite() { return entite; }
        public void setEntite(String entite) { this.entite = entite; }
        
        public String getDate() { return date; }
        public void setDate(String date) { this.date = date; }
        
        public String getIcone() { return icone; }
        public void setIcone(String icone) { this.icone = icone; }
        
        public String getUtilisateur() { return utilisateur; }
        public void setUtilisateur(String utilisateur) { this.utilisateur = utilisateur; }
        
        public String getDetails() { return details; }
        public void setDetails(String details) { this.details = details; }
    }
    
    public static class EvolutionMois {
        private String periode;
        private int valeur;
        private int hauteur;
        
        // Getters et setters
        public String getPeriode() { return periode; }
        public void setPeriode(String periode) { this.periode = periode; }
        
        public int getValeur() { return valeur; }
        public void setValeur(int valeur) { this.valeur = valeur; }
        
        public int getHauteur() { return hauteur; }
        public void setHauteur(int hauteur) { this.hauteur = hauteur; }
    }
    
    public static class RevenusData {
        private String mensuel;
        private String annuel;
        private String croissance;
        private String moyenne;
        private String croissanceMensuelle;
        private String objectifAnnuel;
        private String derniereMAJ;
        private List<MoisRevenu> evolution = new ArrayList<>();
        
        // Getters et setters
        public String getMensuel() { return mensuel; }
        public void setMensuel(String mensuel) { this.mensuel = mensuel; }
        
        public String getAnnuel() { return annuel; }
        public void setAnnuel(String annuel) { this.annuel = annuel; }
        
        public String getCroissance() { return croissance; }
        public void setCroissance(String croissance) { this.croissance = croissance; }
        
        public String getMoyenne() { return moyenne; }
        public void setMoyenne(String moyenne) { this.moyenne = moyenne; }
        
        public String getCroissanceMensuelle() { return croissanceMensuelle; }
        public void setCroissanceMensuelle(String croissanceMensuelle) { this.croissanceMensuelle = croissanceMensuelle; }
        
        public String getObjectifAnnuel() { return objectifAnnuel; }
        public void setObjectifAnnuel(String objectifAnnuel) { this.objectifAnnuel = objectifAnnuel; }
        
        public String getDerniereMAJ() { return derniereMAJ; }
        public void setDerniereMAJ(String derniereMAJ) { this.derniereMAJ = derniereMAJ; }
        
        public List<MoisRevenu> getEvolution() { return evolution; }
        public void setEvolution(List<MoisRevenu> evolution) { this.evolution = evolution; }
    }
    
    public static class MoisRevenu {
        private String nom;
        private int hauteur;
        private String valeur;
        
        // Getters et setters
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public int getHauteur() { return hauteur; }
        public void setHauteur(int hauteur) { this.hauteur = hauteur; }
        
        public String getValeur() { return valeur; }
        public void setValeur(String valeur) { this.valeur = valeur; }
    }
}