package dev.lions.unionflow.client.view;

import jakarta.enterprise.context.SessionScoped;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.annotation.PostConstruct;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Logger;

/**
 * Bean pour la gestion des favoris de l'utilisateur
 * Gère les pages favorites, documents favoris, contacts favoris et raccourcis personnalisés
 */
@Named("favorisBean")
@SessionScoped
public class FavorisBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(FavorisBean.class.getName());
    
    @Inject
    private UserSession userSession;
    
    // Statistiques
    private int totalFavoris = 0;
    private int totalPages = 0;
    private int totalDocuments = 0;
    private int totalContacts = 0;
    
    // Favoris
    private List<PageFavorite> pagesFavorites;
    private List<DocumentFavorite> documentsFavoris;
    private List<ContactFavorite> contactsFavoris;
    private List<RaccourciPersonnalise> raccourcis;
    
    @PostConstruct
    public void init() {
        chargerFavoris();
    }
    
    /**
     * Charge tous les favoris
     */
    public void chargerFavoris() {
        chargerPagesFavorites();
        chargerDocumentsFavoris();
        chargerContactsFavoris();
        chargerRaccourcis();
        calculerStatistiques();
    }
    
    /**
     * Charge les pages favorites
     */
    private void chargerPagesFavorites() {
        pagesFavorites = new ArrayList<>();
        
        // Pages favorites par défaut
        PageFavorite page1 = new PageFavorite();
        page1.setId(UUID.randomUUID());
        page1.setTitre("Mes Activités");
        page1.setDescription("Historique et suivi de vos actions");
        page1.setUrl("/pages/secure/personnel/activites.xhtml");
        page1.setIcon("pi-chart-bar");
        page1.setCouleur("blue");
        page1.setCategorie("FONCTIONNALITE");
        page1.setDerniereVisite("il y a 5 min");
        page1.setNbVisites(45);
        page1.setEstPlusUtilise(true);
        pagesFavorites.add(page1);
        
        PageFavorite page2 = new PageFavorite();
        page2.setId(UUID.randomUUID());
        page2.setTitre("Mon Agenda");
        page2.setDescription("Planning et événements personnels");
        page2.setUrl("/pages/secure/personnel/agenda.xhtml");
        page2.setIcon("pi-calendar");
        page2.setCouleur("green");
        page2.setCategorie("FONCTIONNALITE");
        page2.setDerniereVisite("il y a 2h");
        page2.setNbVisites(23);
        pagesFavorites.add(page2);
        
        PageFavorite page3 = new PageFavorite();
        page3.setId(UUID.randomUUID());
        page3.setTitre("Liste des Membres");
        page3.setDescription("Annuaire et contacts membres");
        page3.setUrl("/pages/secure/membre/liste.xhtml");
        page3.setIcon("pi-users");
        page3.setCouleur("purple");
        page3.setCategorie("FONCTIONNALITE");
        page3.setDerniereVisite("Hier");
        page3.setNbVisites(12);
        pagesFavorites.add(page3);
        
        PageFavorite page4 = new PageFavorite();
        page4.setId(UUID.randomUUID());
        page4.setTitre("Cotisations");
        page4.setDescription("Paiements et historique");
        page4.setUrl("/pages/secure/cotisation/liste.xhtml");
        page4.setIcon("pi-dollar");
        page4.setCouleur("orange");
        page4.setCategorie("FINANCE");
        page4.setDerniereVisite("il y a 3 jours");
        page4.setNbVisites(8);
        pagesFavorites.add(page4);
        
        PageFavorite page5 = new PageFavorite();
        page5.setId(UUID.randomUUID());
        page5.setTitre("Rapports Financiers");
        page5.setDescription("Consultez vos rapports financiers personnels");
        page5.setUrl("/pages/secure/rapport/finances.xhtml");
        page5.setIcon("pi-chart-bar");
        page5.setCouleur("green");
        page5.setCategorie("FINANCE");
        page5.setDerniereVisite("il y a 1 semaine");
        page5.setNbVisites(3);
        pagesFavorites.add(page5);
        
        PageFavorite page6 = new PageFavorite();
        page6.setId(UUID.randomUUID());
        page6.setTitre("Mes Formations");
        page6.setDescription("Catalogue et suivi de vos formations");
        page6.setUrl("/pages/secure/formation/liste.xhtml");
        page6.setIcon("pi-graduation-cap");
        page6.setCouleur("purple");
        page6.setCategorie("FORMATION");
        page6.setDerniereVisite("il y a 1 semaine");
        page6.setNbVisites(1);
        pagesFavorites.add(page6);
        
        PageFavorite page7 = new PageFavorite();
        page7.setId(UUID.randomUUID());
        page7.setTitre("Guide Utilisateur");
        page7.setDescription("Documentation et aide à l'utilisation");
        page7.setUrl("/pages/public/aide.xhtml");
        page7.setIcon("pi-book");
        page7.setCouleur("green");
        page7.setCategorie("AIDE");
        page7.setDerniereVisite("il y a 1 semaine");
        page7.setNbVisites(5);
        pagesFavorites.add(page7);
        
        PageFavorite page8 = new PageFavorite();
        page8.setId(UUID.randomUUID());
        page8.setTitre("Rapports & Statistiques");
        page8.setDescription("Analyses et statistiques détaillées");
        page8.setUrl("/pages/secure/rapport/activites.xhtml");
        page8.setIcon("pi-chart-line");
        page8.setCouleur("blue");
        page8.setCategorie("RAPPORT");
        page8.setDerniereVisite("il y a 2 semaines");
        page8.setNbVisites(2);
        pagesFavorites.add(page8);
    }
    
    /**
     * Charge les documents favoris
     */
    private void chargerDocumentsFavoris() {
        documentsFavoris = new ArrayList<>();
        
        DocumentFavorite doc1 = new DocumentFavorite();
        doc1.setId(UUID.randomUUID());
        doc1.setNom("Certificat_Formation_Leadership_2023.pdf");
        doc1.setType("PDF");
        doc1.setTaille(2457600); // 2.4 MB
        doc1.setDateAjout(LocalDate.of(2023, 12, 15));
        doc1.setCategorie("CERTIFICAT");
        doc1.setDescription("Certification de leadership obtenue en 2023");
        documentsFavoris.add(doc1);
        
        DocumentFavorite doc2 = new DocumentFavorite();
        doc2.setId(UUID.randomUUID());
        doc2.setNom("Budget_Personnel_2024.xlsx");
        doc2.setType("XLSX");
        doc2.setTaille(91136); // 89 KB
        doc2.setDateAjout(LocalDate.of(2024, 1, 3));
        doc2.setCategorie("BUDGET");
        doc2.setDescription("Feuille de calcul pour la gestion budgétaire");
        documentsFavoris.add(doc2);
        
        DocumentFavorite doc3 = new DocumentFavorite();
        doc3.setId(UUID.randomUUID());
        doc3.setNom("Reglement_Interieur_2024.docx");
        doc3.setType("DOCX");
        doc3.setTaille(250880); // 245 KB
        doc3.setDateAjout(LocalDate.of(2023, 12, 28));
        doc3.setCategorie("REGLEMENT");
        doc3.setDescription("Règlement intérieur de l'association mis à jour");
        documentsFavoris.add(doc3);
    }
    
    /**
     * Charge les contacts favoris
     */
    private void chargerContactsFavoris() {
        contactsFavoris = new ArrayList<>();
        
        ContactFavorite contact1 = new ContactFavorite();
        contact1.setId(UUID.randomUUID());
        contact1.setNom("Thomas Martin");
        contact1.setFonction("Président de l'association");
        contact1.setEmail("thomas.martin@email.com");
        contact1.setCategorie("ADMIN");
        contactsFavoris.add(contact1);
        
        ContactFavorite contact2 = new ContactFavorite();
        contact2.setId(UUID.randomUUID());
        contact2.setNom("Sophie Leroy");
        contact2.setFonction("Responsable formations");
        contact2.setEmail("sophie.leroy@email.com");
        contact2.setCategorie("FORMATION");
        contactsFavoris.add(contact2);
        
        ContactFavorite contact3 = new ContactFavorite();
        contact3.setId(UUID.randomUUID());
        contact3.setNom("Marc Durand");
        contact3.setFonction("Support technique");
        contact3.setEmail("marc.durand@email.com");
        contact3.setCategorie("SUPPORT");
        contactsFavoris.add(contact3);
    }
    
    /**
     * Charge les raccourcis personnalisés
     */
    private void chargerRaccourcis() {
        raccourcis = new ArrayList<>();
        
        RaccourciPersonnalise racc1 = new RaccourciPersonnalise();
        racc1.setId(UUID.randomUUID());
        racc1.setTitre("Nouveau Membre");
        racc1.setDescription("Lien direct vers le formulaire d'inscription");
        racc1.setUrl("/pages/secure/membre/creation.xhtml");
        racc1.setIcon("pi-bookmark");
        racc1.setCouleur("blue");
        raccourcis.add(racc1);
        
        RaccourciPersonnalise racc2 = new RaccourciPersonnalise();
        racc2.setId(UUID.randomUUID());
        racc2.setTitre("Calculateur");
        racc2.setDescription("Calcul automatique des cotisations");
        racc2.setUrl("/pages/secure/cotisation/calculateur.xhtml");
        racc2.setIcon("pi-calculator");
        racc2.setCouleur("green");
        raccourcis.add(racc2);
        
        RaccourciPersonnalise racc3 = new RaccourciPersonnalise();
        racc3.setId(UUID.randomUUID());
        racc3.setTitre("Impression Rapide");
        racc3.setDescription("Templates prêts à imprimer");
        racc3.setUrl("/pages/secure/document/impression.xhtml");
        racc3.setIcon("pi-print");
        racc3.setCouleur("purple");
        raccourcis.add(racc3);
    }
    
    /**
     * Calcule les statistiques
     */
    private void calculerStatistiques() {
        totalPages = pagesFavorites != null ? pagesFavorites.size() : 0;
        totalDocuments = documentsFavoris != null ? documentsFavoris.size() : 0;
        totalContacts = contactsFavoris != null ? contactsFavoris.size() : 0;
        totalFavoris = totalPages + totalDocuments + totalContacts;
    }
    
    /**
     * Retire une page des favoris
     */
    public void retirerPageFavorite(UUID id) {
        if (pagesFavorites != null) {
            pagesFavorites.removeIf(p -> p.getId().equals(id));
            calculerStatistiques();
            ajouterMessage(FacesMessage.SEVERITY_INFO, "Succès", "Page retirée des favoris");
        }
    }
    
    /**
     * Retire un document des favoris
     */
    public void retirerDocumentFavorite(UUID id) {
        if (documentsFavoris != null) {
            documentsFavoris.removeIf(d -> d.getId().equals(id));
            calculerStatistiques();
            ajouterMessage(FacesMessage.SEVERITY_INFO, "Succès", "Document retiré des favoris");
        }
    }
    
    /**
     * Retire un contact des favoris
     */
    public void retirerContactFavorite(UUID id) {
        if (contactsFavoris != null) {
            contactsFavoris.removeIf(c -> c.getId().equals(id));
            calculerStatistiques();
            ajouterMessage(FacesMessage.SEVERITY_INFO, "Succès", "Contact retiré des favoris");
        }
    }
    
    /**
     * Supprime un raccourci
     */
    public void supprimerRaccourci(UUID id) {
        if (raccourcis != null) {
            raccourcis.removeIf(r -> r.getId().equals(id));
            ajouterMessage(FacesMessage.SEVERITY_INFO, "Succès", "Raccourci supprimé");
        }
    }
    
    /**
     * Nettoie tous les favoris
     */
    public void nettoyerTousFavoris() {
        pagesFavorites.clear();
        documentsFavoris.clear();
        contactsFavoris.clear();
        calculerStatistiques();
        ajouterMessage(FacesMessage.SEVERITY_INFO, "Succès", "Tous les favoris ont été supprimés");
    }
    
    private void ajouterMessage(FacesMessage.Severity severity, String summary, String detail) {
        FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage(severity, summary, detail));
    }
    
    // Getters et Setters
    public int getTotalFavoris() { return totalFavoris; }
    public void setTotalFavoris(int totalFavoris) { this.totalFavoris = totalFavoris; }
    
    public int getTotalPages() { return totalPages; }
    public void setTotalPages(int totalPages) { this.totalPages = totalPages; }
    
    public int getTotalDocuments() { return totalDocuments; }
    public void setTotalDocuments(int totalDocuments) { this.totalDocuments = totalDocuments; }
    
    public int getTotalContacts() { return totalContacts; }
    public void setTotalContacts(int totalContacts) { this.totalContacts = totalContacts; }
    
    public List<PageFavorite> getPagesFavorites() { return pagesFavorites; }
    public void setPagesFavorites(List<PageFavorite> pagesFavorites) { this.pagesFavorites = pagesFavorites; }
    
    public List<DocumentFavorite> getDocumentsFavoris() { return documentsFavoris; }
    public void setDocumentsFavoris(List<DocumentFavorite> documentsFavoris) { this.documentsFavoris = documentsFavoris; }
    
    public List<ContactFavorite> getContactsFavoris() { return contactsFavoris; }
    public void setContactsFavoris(List<ContactFavorite> contactsFavoris) { this.contactsFavoris = contactsFavoris; }
    
    public List<RaccourciPersonnalise> getRaccourcis() { return raccourcis; }
    public void setRaccourcis(List<RaccourciPersonnalise> raccourcis) { this.raccourcis = raccourcis; }
    
    // Classes internes
    public static class PageFavorite implements Serializable {
        private UUID id;
        private String titre;
        private String description;
        private String url;
        private String icon;
        private String couleur;
        private String categorie;
        private String derniereVisite;
        private int nbVisites;
        private boolean estPlusUtilise;
        
        public UUID getId() { return id; }
        public void setId(UUID id) { this.id = id; }
        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 getUrl() { return url; }
        public void setUrl(String url) { this.url = url; }
        public String getIcon() { return icon; }
        public void setIcon(String icon) { this.icon = icon; }
        public String getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
        public String getCategorie() { return categorie; }
        public void setCategorie(String categorie) { this.categorie = categorie; }
        public String getDerniereVisite() { return derniereVisite; }
        public void setDerniereVisite(String derniereVisite) { this.derniereVisite = derniereVisite; }
        public int getNbVisites() { return nbVisites; }
        public void setNbVisites(int nbVisites) { this.nbVisites = nbVisites; }
        public boolean isEstPlusUtilise() { return estPlusUtilise; }
        public void setEstPlusUtilise(boolean estPlusUtilise) { this.estPlusUtilise = estPlusUtilise; }
    }
    
    public static class DocumentFavorite implements Serializable {
        private UUID id;
        private String nom;
        private String type;
        private long taille;
        private LocalDate dateAjout;
        private String categorie;
        private String description;
        
        public UUID getId() { return id; }
        public void setId(UUID id) { this.id = id; }
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        public long getTaille() { return taille; }
        public void setTaille(long taille) { this.taille = taille; }
        public LocalDate getDateAjout() { return dateAjout; }
        public void setDateAjout(LocalDate dateAjout) { this.dateAjout = dateAjout; }
        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 String getTailleFormatee() {
            if (taille < 1024) {
                return taille + " B";
            } else if (taille < 1024 * 1024) {
                return String.format("%.1f KB", taille / 1024.0);
            } else {
                return String.format("%.1f MB", taille / (1024.0 * 1024.0));
            }
        }
    }
    
    public static class ContactFavorite implements Serializable {
        private UUID id;
        private String nom;
        private String fonction;
        private String email;
        private String categorie;
        
        public UUID getId() { return id; }
        public void setId(UUID id) { this.id = id; }
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        public String getFonction() { return fonction; }
        public void setFonction(String fonction) { this.fonction = fonction; }
        public String getEmail() { return email; }
        public void setEmail(String email) { this.email = email; }
        public String getCategorie() { return categorie; }
        public void setCategorie(String categorie) { this.categorie = categorie; }
    }
    
    public static class RaccourciPersonnalise implements Serializable {
        private UUID id;
        private String titre;
        private String description;
        private String url;
        private String icon;
        private String couleur;
        
        public UUID getId() { return id; }
        public void setId(UUID id) { this.id = id; }
        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 getUrl() { return url; }
        public void setUrl(String url) { this.url = url; }
        public String getIcon() { return icon; }
        public void setIcon(String icon) { this.icon = icon; }
        public String getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
    }
}

