package dev.lions.unionflow.client.view;

import jakarta.enterprise.context.SessionScoped;
import jakarta.inject.Named;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

@Named("guideBean")
@SessionScoped
public class GuideBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // Structure du guide
    private List<SectionGuide> toutesSections;
    private SectionGuide sectionCourante;
    private String sectionActiveId = "default";
    private int sectionActive = 0;
    
    // Recherche
    private String termeRecherche = "";
    
    public GuideBean() {
        initialiserSections();
        sectionCourante = new SectionGuide("default", "Accueil", "", "", 0, false);
    }
    
    private void initialiserSections() {
        toutesSections = new ArrayList<>();
        
        // Section 1: Premiers pas
        toutesSections.add(new SectionGuide("premiers-pas-connexion", "Se connecter", "Premiers Pas", "Apprendre à se connecter à UnionFlow", 5, false));
        toutesSections.add(new SectionGuide("premiers-pas-interface", "Découvrir l'interface", "Premiers Pas", "Navigation et organisation de l'interface", 8, false));
        toutesSections.add(new SectionGuide("premiers-pas-profil", "Configurer son profil", "Premiers Pas", "Personnaliser ses informations personnelles", 10, false));
        toutesSections.add(new SectionGuide("premiers-pas-navigation", "Navigation dans le système", "Premiers Pas", "Utiliser les menus et raccourcis", 6, false));
        
        // Section 2: Gestion des membres
        toutesSections.add(new SectionGuide("membres-inscription", "Inscrire un membre", "Gestion Membres", "Processus d'inscription d'un nouveau membre", 12, false));
        toutesSections.add(new SectionGuide("membres-modification", "Modifier un profil", "Gestion Membres", "Mettre à jour les informations d'un membre", 8, false));
        toutesSections.add(new SectionGuide("membres-recherche", "Rechercher des membres", "Gestion Membres", "Utiliser les filtres de recherche avancée", 6, false));
        toutesSections.add(new SectionGuide("membres-export", "Exporter la liste", "Gestion Membres", "Générer des exports Excel et PDF", 10, false));
        toutesSections.add(new SectionGuide("membres-historique", "Consulter l'historique", "Gestion Membres", "Suivre les modifications et activités", 7, false));
        
        // Section 3: Finances
        toutesSections.add(new SectionGuide("finances-cotisations", "Gérer les cotisations", "Finances", "Configuration et suivi des cotisations", 15, false));
        toutesSections.add(new SectionGuide("finances-paiements", "Enregistrer les paiements", "Finances", "Saisie manuelle et automatique", 12, false));
        toutesSections.add(new SectionGuide("finances-relances", "Relances automatiques", "Finances", "Configuration des rappels de paiement", 10, false));
        toutesSections.add(new SectionGuide("finances-rapports", "Rapports financiers", "Finances", "Générer des bilans et statistiques", 18, false));
        
        // Section 4: Événements
        toutesSections.add(new SectionGuide("events-creation", "Créer un événement", "Événements", "Planifier et organiser des événements", 15, false));
        toutesSections.add(new SectionGuide("events-inscriptions", "Gérer les inscriptions", "Événements", "Suivre les participations", 10, false));
        toutesSections.add(new SectionGuide("events-communication", "Communication événement", "Événements", "Envoyer invitations et rappels", 12, false));
        toutesSections.add(new SectionGuide("events-bilan", "Bilan post-événement", "Événements", "Analyser la participation et satisfaction", 8, false));
        
        // Section 5: Rapports
        toutesSections.add(new SectionGuide("rapports-creation", "Créer des rapports", "Rapports", "Utiliser le générateur de rapports", 20, false));
        toutesSections.add(new SectionGuide("rapports-tableaux", "Tableaux de bord", "Rapports", "Configurer ses indicateurs personnalisés", 15, false));
        toutesSections.add(new SectionGuide("rapports-export", "Export et partage", "Rapports", "Distribuer les rapports aux parties prenantes", 10, false));
        
        // Section 6: Administration
        toutesSections.add(new SectionGuide("admin-utilisateurs", "Gestion des utilisateurs", "Administration", "Créer et gérer les comptes utilisateurs", 18, false));
        toutesSections.add(new SectionGuide("admin-permissions", "Rôles et permissions", "Administration", "Configuration des droits d'accès", 22, false));
        toutesSections.add(new SectionGuide("admin-parametres", "Paramètres système", "Administration", "Configuration générale de l'application", 25, false));
        toutesSections.add(new SectionGuide("admin-sauvegarde", "Sauvegarde et sécurité", "Administration", "Protéger et sauvegarder les données", 15, false));
        toutesSections.add(new SectionGuide("admin-audit", "Journal d'audit", "Administration", "Surveiller l'activité et la sécurité", 12, false));
    }
    
    // Getters pour les sections par catégorie
    public List<SectionGuide> getSectionsPremiersPas() {
        return toutesSections.stream()
                           .filter(s -> "Premiers Pas".equals(s.getCategorie()))
                           .collect(Collectors.toList());
    }
    
    public List<SectionGuide> getSectionsMembres() {
        return toutesSections.stream()
                           .filter(s -> "Gestion Membres".equals(s.getCategorie()))
                           .collect(Collectors.toList());
    }
    
    public List<SectionGuide> getSectionsFinances() {
        return toutesSections.stream()
                           .filter(s -> "Finances".equals(s.getCategorie()))
                           .collect(Collectors.toList());
    }
    
    public List<SectionGuide> getSectionsEvenements() {
        return toutesSections.stream()
                           .filter(s -> "Événements".equals(s.getCategorie()))
                           .collect(Collectors.toList());
    }
    
    public List<SectionGuide> getSectionsRapports() {
        return toutesSections.stream()
                           .filter(s -> "Rapports".equals(s.getCategorie()))
                           .collect(Collectors.toList());
    }
    
    public List<SectionGuide> getSectionsAdmin() {
        return toutesSections.stream()
                           .filter(s -> "Administration".equals(s.getCategorie()))
                           .collect(Collectors.toList());
    }
    
    // Statistiques de progression
    public int getTotalSections() {
        return toutesSections.size();
    }
    
    public int getSectionsLues() {
        return (int) toutesSections.stream().filter(SectionGuide::isLu).count();
    }
    
    public int getPourcentageProgression() {
        if (getTotalSections() == 0) return 0;
        return (getSectionsLues() * 100) / getTotalSections();
    }
    
    // Navigation
    public void naviguerVers(String sectionId) {
        this.sectionActiveId = sectionId;
        this.sectionCourante = toutesSections.stream()
                                           .filter(s -> s.getId().equals(sectionId))
                                           .findFirst()
                                           .orElse(new SectionGuide("default", "Accueil", "", "", 0, false));
    }
    
    public void sectionPrecedente() {
        int index = trouverIndexSection(sectionActiveId);
        if (index > 0) {
            naviguerVers(toutesSections.get(index - 1).getId());
        }
    }
    
    public void sectionSuivante() {
        int index = trouverIndexSection(sectionActiveId);
        if (index < toutesSections.size() - 1) {
            naviguerVers(toutesSections.get(index + 1).getId());
        }
    }
    
    public boolean isAPrecedent() {
        return trouverIndexSection(sectionActiveId) > 0;
    }
    
    public boolean isASuivant() {
        int index = trouverIndexSection(sectionActiveId);
        return index >= 0 && index < toutesSections.size() - 1;
    }
    
    private int trouverIndexSection(String sectionId) {
        for (int i = 0; i < toutesSections.size(); i++) {
            if (toutesSections.get(i).getId().equals(sectionId)) {
                return i;
            }
        }
        return -1;
    }
    
    // Marquer comme lu
    public void marquerCommeLu() {
        if (sectionCourante != null && !sectionCourante.getId().equals("default")) {
            sectionCourante.setLu(true);
            // Mettre à jour aussi dans la liste principale
            toutesSections.stream()
                        .filter(s -> s.getId().equals(sectionCourante.getId()))
                        .findFirst()
                        .ifPresent(s -> s.setLu(true));
        }
    }
    
    // Recherche
    public List<SectionGuide> getResultatsRecherche() {
        if (termeRecherche == null || termeRecherche.trim().isEmpty()) {
            return new ArrayList<>();
        }
        
        String terme = termeRecherche.toLowerCase();
        return toutesSections.stream()
                           .filter(s -> s.getTitre().toLowerCase().contains(terme) ||
                                      s.getDescription().toLowerCase().contains(terme) ||
                                      s.getCategorie().toLowerCase().contains(terme))
                           .limit(8)
                           .collect(Collectors.toList());
    }
    
    // Getters et Setters
    public SectionGuide getSectionCourante() { return sectionCourante; }
    public void setSectionCourante(SectionGuide sectionCourante) { this.sectionCourante = sectionCourante; }
    
    public String getSectionActiveId() { return sectionActiveId; }
    public void setSectionActiveId(String sectionActiveId) { this.sectionActiveId = sectionActiveId; }
    
    public int getSectionActive() { return sectionActive; }
    public void setSectionActive(int sectionActive) { this.sectionActive = sectionActive; }
    
    public String getTermeRecherche() { return termeRecherche; }
    public void setTermeRecherche(String termeRecherche) { this.termeRecherche = termeRecherche; }
    
    // Classe interne SectionGuide
    public static class SectionGuide implements Serializable {
        private String id;
        private String titre;
        private String categorie;
        private String description;
        private int tempsLecture; // en minutes
        private boolean lu;
        
        public SectionGuide() {}
        
        public SectionGuide(String id, String titre, String categorie, String description, int tempsLecture, boolean lu) {
            this.id = id;
            this.titre = titre;
            this.categorie = categorie;
            this.description = description;
            this.tempsLecture = tempsLecture;
            this.lu = lu;
        }
        
        // Getters et Setters
        public String getId() { return id; }
        public void setId(String id) { this.id = id; }
        
        public String getTitre() { return titre; }
        public void setTitre(String titre) { this.titre = titre; }
        
        public String getCategorie() { return categorie; }
        public void setCategorie(String categorie) { this.categorie = categorie; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public int getTempsLecture() { return tempsLecture; }
        public void setTempsLecture(int tempsLecture) { this.tempsLecture = tempsLecture; }
        
        public boolean isLu() { return lu; }
        public void setLu(boolean lu) { this.lu = lu; }
    }
}
