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

@Named("documentsBean")
@SessionScoped
public class DocumentsBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private List<Document> tousLesDocuments;
    private List<Document> documentsFiltres;
    private List<Document> documentsSelectionnes;
    private List<Dossier> dossiersAffichage;
    private List<Dossier> dossiersDisponibles;
    private List<NiveauNavigation> cheminNavigation;
    
    private Document documentSelectionne;
    private Dossier dossierSelectionne;
    private NouveauDocument nouveauDocument;
    private Filtres filtres;
    private StatistiquesDocuments statistiques;
    
    private String modeAffichage = "GRID"; // GRID ou LIST
    private Long dossierActuelId;
    
    @PostConstruct
    public void init() {
        initializeFiltres();
        initializeStatistiques();
        initializeDossiers();
        initializeDocuments();
        initializeNouveauDocument();
        initializeNavigation();
        appliquerFiltres();
    }
    
    private void initializeFiltres() {
        filtres = new Filtres();
        documentsSelectionnes = new ArrayList<>();
    }
    
    private void initializeStatistiques() {
        statistiques = new StatistiquesDocuments();
        statistiques.setTotalDocuments(1847);
        statistiques.setTotalDossiers(23);
        statistiques.setEspaceUtilise("2.3 GB");
        statistiques.setPartagesMois(156);
    }
    
    private void initializeDossiers() {
        dossiersAffichage = new ArrayList<>();
        dossiersDisponibles = new ArrayList<>();
        
        String[] nomsDossiers = {
            "Documents Administratifs", "Finances et Comptabilité", "Ressources Humaines",
            "Communication", "Formations", "Projets et Actions", "Archives 2023",
            "Modèles et Templates", "Rapports Mensuels", "Juridique et Conformité"
        };
        
        String[] couleurs = {
            "blue-500", "green-500", "orange-500", "purple-500", "indigo-500",
            "teal-500", "gray-500", "pink-500", "yellow-500", "red-500"
        };
        
        for (int i = 0; i < nomsDossiers.length; i++) {
            Dossier dossier = new Dossier();
            dossier.setId((long) (i + 1));
            dossier.setNom(nomsDossiers[i]);
            dossier.setCouleur(couleurs[i % couleurs.length]);
            dossier.setNombreDocuments(15 + (i * 8));
            dossier.setDerniereModification(LocalDateTime.now().minusDays(i + 1));
            dossier.setCheminComplet("/" + nomsDossiers[i]);
            
            dossiersAffichage.add(dossier);
            dossiersDisponibles.add(dossier);
        }
    }
    
    private void initializeDocuments() {
        tousLesDocuments = new ArrayList<>();
        
        String[] noms = {
            "Règlement Intérieur 2024.pdf", "Budget Prévisionnel Q1.xlsx", "Procès-Verbal AG Mars.docx",
            "Guide Nouveau Membre.pdf", "Rapport Activités Janvier.docx", "Factures Fournisseurs Q4.xlsx",
            "Statuts Association.pdf", "Plan Communication 2024.pptx", "Formation Leadership.pdf",
            "Rapport Financier Annuel.pdf", "Convention Partenariat.docx", "Charte Graphique.pdf",
            "Manuel Procédures.docx", "Bilan Social 2023.xlsx", "Certificat Conformité.pdf",
            "Guide Utilisateur Plateforme.pdf", "Contrat Assurance.pdf", "Rapport Audit.docx",
            "Plan Stratégique 3 ans.pptx", "Inventaire Matériel.xlsx", "Politique RGPD.pdf"
        };
        
        String[] types = {"PDF", "EXCEL", "WORD", "PDF", "WORD", "EXCEL", "PDF", "POWERPOINT", "PDF", "PDF", "WORD", "PDF", "WORD", "EXCEL", "PDF", "PDF", "PDF", "WORD", "POWERPOINT", "EXCEL", "PDF"};
        String[] categories = {"ADMINISTRATIF", "FINANCIER", "ADMINISTRATIF", "FORMATION", "ADMINISTRATIF", "FINANCIER", "JURIDIQUE", "COMMUNICATION", "FORMATION", "FINANCIER", "JURIDIQUE", "COMMUNICATION", "ADMINISTRATIF", "FINANCIER", "JURIDIQUE", "FORMATION", "JURIDIQUE", "FINANCIER", "ADMINISTRATIF", "ADMINISTRATIF", "JURIDIQUE"};
        String[] statuts = {"VALIDE", "VALIDE", "BROUILLON", "VALIDE", "VALIDE", "ARCHIVE", "VALIDE", "BROUILLON", "VALIDE", "VALIDE", "VALIDE", "VALIDE", "BROUILLON", "ARCHIVE", "VALIDE", "VALIDE", "VALIDE", "VALIDE", "BROUILLON", "VALIDE", "VALIDE"};
        String[] auteurs = {"Marie Kouassi", "Paul Traoré", "Fatou Sanogo", "Jean Ouattara", "Aissata Koné", "Ibrahim Touré", "Aminata Bakayoko", "Yves Koffi", "Mariam Coulibaly", "Seydou Cissé", "Adjoa Mensah"};
        
        long[] tailles = {2047000, 845000, 1250000, 3100000, 890000, 1450000, 567000, 2800000, 1900000, 3400000, 780000, 1200000, 1850000, 920000, 450000, 2200000, 890000, 1650000, 4200000, 680000, 750000};
        
        for (int i = 0; i < noms.length; i++) {
            Document document = new Document();
            document.setId((long) (i + 1));
            document.setNom(noms[i]);
            document.setType(types[i]);
            document.setCategorie(categories[i]);
            document.setStatut(statuts[i]);
            document.setAuteur(auteurs[i % auteurs.length]);
            document.setTailleBytes(tailles[i]);
            document.setDateCreation(LocalDateTime.now().minusDays(i * 3 + 1));
            document.setDateModification(LocalDateTime.now().minusDays(i + 1));
            document.setNombreVues(25 + (i * 7));
            document.setNombreTelecharements(5 + (i * 2));
            
            // Description automatique
            document.setDescription("Document " + categories[i].toLowerCase() + " - " + noms[i]);
            
            // Mots-clés automatiques
            document.setMotsCles(generateMotsCles(categories[i], types[i]));
            
            // Dossier parent (certains documents sont à la racine)
            if (i % 3 != 0) {
                document.setDossierId((long) ((i % dossiersDisponibles.size()) + 1));
            }
            
            tousLesDocuments.add(document);
        }
    }
    
    private String generateMotsCles(String categorie, String type) {
        String base = categorie.toLowerCase().replace("_", " ");
        String typeClean = type.toLowerCase();
        return base + ", " + typeClean + ", officiel, important";
    }
    
    private void initializeNouveauDocument() {
        nouveauDocument = new NouveauDocument();
        nouveauDocument.setAccesRestreint(false);
    }
    
    private void initializeNavigation() {
        cheminNavigation = new ArrayList<>();
        
        NiveauNavigation racine = new NiveauNavigation();
        racine.setNom("📁 Racine");
        racine.setDossierId(null);
        cheminNavigation.add(racine);
        
        // Si on est dans un dossier spécifique, ajouter le niveau
        if (dossierActuelId != null) {
            Dossier dossierActuel = dossiersDisponibles.stream()
                    .filter(d -> d.getId().equals(dossierActuelId))
                    .findFirst()
                    .orElse(null);
            
            if (dossierActuel != null) {
                NiveauNavigation niveau = new NiveauNavigation();
                niveau.setNom(dossierActuel.getNom());
                niveau.setDossierId(dossierActuel.getId());
                cheminNavigation.add(niveau);
            }
        }
    }
    
    private void appliquerFiltres() {
        documentsFiltres = tousLesDocuments.stream()
                .filter(this::appliquerFiltre)
                .collect(Collectors.toList());
    }
    
    private boolean appliquerFiltre(Document document) {
        // Filtre par dossier actuel
        if (dossierActuelId != null) {
            if (document.getDossierId() == null || !document.getDossierId().equals(dossierActuelId)) {
                return false;
            }
        } else {
            // Si on est à la racine, ne montrer que les documents sans dossier parent
            if (document.getDossierId() != null) {
                return false;
            }
        }
        
        if (filtres.getNom() != null && !filtres.getNom().trim().isEmpty()) {
            if (!document.getNom().toLowerCase().contains(filtres.getNom().toLowerCase())) {
                return false;
            }
        }
        
        if (filtres.getType() != null && !filtres.getType().trim().isEmpty()) {
            if (!document.getType().equals(filtres.getType())) {
                return false;
            }
        }
        
        if (filtres.getCategorie() != null && !filtres.getCategorie().trim().isEmpty()) {
            if (!document.getCategorie().equals(filtres.getCategorie())) {
                return false;
            }
        }
        
        if (filtres.getStatut() != null && !filtres.getStatut().trim().isEmpty()) {
            if (!document.getStatut().equals(filtres.getStatut())) {
                return false;
            }
        }
        
        if (filtres.getAuteur() != null && !filtres.getAuteur().trim().isEmpty()) {
            if (!document.getAuteur().toLowerCase().contains(filtres.getAuteur().toLowerCase())) {
                return false;
            }
        }
        
        if (filtres.getMotsCles() != null && !filtres.getMotsCles().trim().isEmpty()) {
            if (!document.getMotsCles().toLowerCase().contains(filtres.getMotsCles().toLowerCase())) {
                return false;
            }
        }
        
        if (filtres.getDateDebut() != null) {
            if (document.getDateCreation().toLocalDate().isBefore(filtres.getDateDebut())) {
                return false;
            }
        }
        
        if (filtres.getDateFin() != null) {
            if (document.getDateCreation().toLocalDate().isAfter(filtres.getDateFin())) {
                return false;
            }
        }
        
        if (filtres.getTailleMax() != null && filtres.getTailleMax() > 0) {
            long tailleMaxBytes = filtres.getTailleMax().longValue() * 1024 * 1024; // Conversion MB vers bytes
            if (document.getTailleBytes() > tailleMaxBytes) {
                return false;
            }
        }
        
        return true;
    }
    
    // Actions
    public void rechercher() {
        appliquerFiltres();
    }
    
    public void reinitialiserFiltres() {
        filtres = new Filtres();
        appliquerFiltres();
    }
    
    public void changerModeAffichage(String mode) {
        this.modeAffichage = mode;
    }
    
    public void naviguerVersDossier(Dossier dossier) {
        this.dossierActuelId = dossier.getId();
        initializeNavigation();
        appliquerFiltres();
    }
    
    public void telechargerNouveauDocument() {
        Document nouveau = new Document();
        nouveau.setId((long) (tousLesDocuments.size() + 1));
        nouveau.setNom("Nouveau Document " + (tousLesDocuments.size() + 1));
        nouveau.setCategorie(nouveauDocument.getCategorie());
        nouveau.setDescription(nouveauDocument.getDescription());
        nouveau.setMotsCles(nouveauDocument.getMotsCles());
        nouveau.setDossierId(nouveauDocument.getDossierId());
        nouveau.setStatut("BROUILLON");
        nouveau.setAuteur("Utilisateur Actuel");
        nouveau.setDateCreation(LocalDateTime.now());
        nouveau.setDateModification(LocalDateTime.now());
        nouveau.setTailleBytes(1024000L); // 1MB par défaut
        nouveau.setNombreVues(0);
        nouveau.setNombreTelecharements(0);
        nouveau.setType("PDF"); // Type par défaut
        
        tousLesDocuments.add(nouveau);
        appliquerFiltres();
        
        System.out.println("Document téléchargé: " + nouveau.getNom());
        initializeNouveauDocument();
    }
    
    public void telechargerDocument(Document document) {
        document.setNombreTelecharements(document.getNombreTelecharements() + 1);
        System.out.println("Téléchargement du document: " + document.getNom());
    }
    
    public void supprimerDocument(Document document) {
        tousLesDocuments.remove(document);
        appliquerFiltres();
        System.out.println("Document supprimé: " + document.getNom());
    }
    
    public void dupliquerDocument() {
        if (documentSelectionne != null) {
            Document copie = new Document();
            copie.setId((long) (tousLesDocuments.size() + 1));
            copie.setNom(documentSelectionne.getNom() + " (Copie)");
            copie.setType(documentSelectionne.getType());
            copie.setCategorie(documentSelectionne.getCategorie());
            copie.setStatut("BROUILLON");
            copie.setAuteur("Utilisateur Actuel");
            copie.setDescription(documentSelectionne.getDescription());
            copie.setMotsCles(documentSelectionne.getMotsCles());
            copie.setDossierId(documentSelectionne.getDossierId());
            copie.setTailleBytes(documentSelectionne.getTailleBytes());
            copie.setDateCreation(LocalDateTime.now());
            copie.setDateModification(LocalDateTime.now());
            copie.setNombreVues(0);
            copie.setNombreTelecharements(0);
            
            tousLesDocuments.add(copie);
            appliquerFiltres();
            System.out.println("Document dupliqué: " + copie.getNom());
        }
    }
    
    public void archiverDocument() {
        if (documentSelectionne != null) {
            documentSelectionne.setStatut("ARCHIVE");
            System.out.println("Document archivé: " + documentSelectionne.getNom());
            appliquerFiltres();
        }
    }
    
    public void supprimerDefinitivement() {
        if (documentSelectionne != null) {
            tousLesDocuments.remove(documentSelectionne);
            appliquerFiltres();
            System.out.println("Document supprimé définitivement: " + documentSelectionne.getNom());
        }
    }
    
    public String voirHistoriqueVersions() {
        return "/pages/admin/documents/versions?id=" + documentSelectionne.getId() + "&faces-redirect=true";
    }
    
    public boolean estSelectionne(Document document) {
        return documentsSelectionnes.contains(document);
    }
    
    public void toggleSelection(Document document) {
        if (documentsSelectionnes.contains(document)) {
            documentsSelectionnes.remove(document);
        } else {
            documentsSelectionnes.add(document);
        }
    }
    
    // Getters et Setters
    public List<Document> getTousLesDocuments() { return tousLesDocuments; }
    public void setTousLesDocuments(List<Document> tousLesDocuments) { this.tousLesDocuments = tousLesDocuments; }
    
    public List<Document> getDocumentsFiltres() { return documentsFiltres; }
    public void setDocumentsFiltres(List<Document> documentsFiltres) { this.documentsFiltres = documentsFiltres; }
    
    public List<Document> getDocumentsSelectionnes() { return documentsSelectionnes; }
    public void setDocumentsSelectionnes(List<Document> documentsSelectionnes) { this.documentsSelectionnes = documentsSelectionnes; }
    
    public List<Dossier> getDossiersAffichage() { return dossiersAffichage; }
    public void setDossiersAffichage(List<Dossier> dossiersAffichage) { this.dossiersAffichage = dossiersAffichage; }
    
    public List<Dossier> getDossiersDisponibles() { return dossiersDisponibles; }
    public void setDossiersDisponibles(List<Dossier> dossiersDisponibles) { this.dossiersDisponibles = dossiersDisponibles; }
    
    public List<NiveauNavigation> getCheminNavigation() { return cheminNavigation; }
    public void setCheminNavigation(List<NiveauNavigation> cheminNavigation) { this.cheminNavigation = cheminNavigation; }
    
    public Document getDocumentSelectionne() { return documentSelectionne; }
    public void setDocumentSelectionne(Document documentSelectionne) { this.documentSelectionne = documentSelectionne; }
    
    public Dossier getDossierSelectionne() { return dossierSelectionne; }
    public void setDossierSelectionne(Dossier dossierSelectionne) { this.dossierSelectionne = dossierSelectionne; }
    
    public NouveauDocument getNouveauDocument() { return nouveauDocument; }
    public void setNouveauDocument(NouveauDocument nouveauDocument) { this.nouveauDocument = nouveauDocument; }
    
    public Filtres getFiltres() { return filtres; }
    public void setFiltres(Filtres filtres) { this.filtres = filtres; }
    
    public StatistiquesDocuments getStatistiques() { return statistiques; }
    public void setStatistiques(StatistiquesDocuments statistiques) { this.statistiques = statistiques; }
    
    public String getModeAffichage() { return modeAffichage; }
    public void setModeAffichage(String modeAffichage) { this.modeAffichage = modeAffichage; }
    
    public Long getDossierActuelId() { return dossierActuelId; }
    public void setDossierActuelId(Long dossierActuelId) { this.dossierActuelId = dossierActuelId; }
    
    // Classes internes
    public static class Document {
        private Long id;
        private String nom;
        private String description;
        private String type;
        private String categorie;
        private String statut;
        private String auteur;
        private String motsCles;
        private Long dossierId;
        private long tailleBytes;
        private LocalDateTime dateCreation;
        private LocalDateTime dateModification;
        private int nombreVues;
        private int nombreTelecharements;
        private boolean accesRestreint;
        
        // 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 getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public String getType() { return type; }
        public void setType(String type) { this.type = type; }
        
        public String getCategorie() { return categorie; }
        public void setCategorie(String categorie) { this.categorie = categorie; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getAuteur() { return auteur; }
        public void setAuteur(String auteur) { this.auteur = auteur; }
        
        public String getMotsCles() { return motsCles; }
        public void setMotsCles(String motsCles) { this.motsCles = motsCles; }
        
        public Long getDossierId() { return dossierId; }
        public void setDossierId(Long dossierId) { this.dossierId = dossierId; }
        
        public long getTailleBytes() { return tailleBytes; }
        public void setTailleBytes(long tailleBytes) { this.tailleBytes = tailleBytes; }
        
        public LocalDateTime getDateCreation() { return dateCreation; }
        public void setDateCreation(LocalDateTime dateCreation) { this.dateCreation = dateCreation; }
        
        public LocalDateTime getDateModification() { return dateModification; }
        public void setDateModification(LocalDateTime dateModification) { this.dateModification = dateModification; }
        
        public int getNombreVues() { return nombreVues; }
        public void setNombreVues(int nombreVues) { this.nombreVues = nombreVues; }
        
        public int getNombreTelecharements() { return nombreTelecharements; }
        public void setNombreTelecharements(int nombreTelecharements) { this.nombreTelecharements = nombreTelecharements; }
        
        public boolean isAccesRestreint() { return accesRestreint; }
        public void setAccesRestreint(boolean accesRestreint) { this.accesRestreint = accesRestreint; }
        
        // Propriétés dérivées
        public String getTypeIcon() {
            return switch (type) {
                case "PDF" -> "pi-file-pdf";
                case "WORD" -> "pi-file-word";
                case "EXCEL" -> "pi-file-excel";
                case "POWERPOINT" -> "pi-file";
                case "IMAGE" -> "pi-image";
                default -> "pi-file";
            };
        }
        
        public String getTypeCouleur() {
            return switch (type) {
                case "PDF" -> "red-500";
                case "WORD" -> "blue-500";
                case "EXCEL" -> "green-500";
                case "POWERPOINT" -> "orange-500";
                case "IMAGE" -> "purple-500";
                default -> "gray-500";
            };
        }
        
        public String getCategorieLibelle() {
            return switch (categorie) {
                case "ADMINISTRATIF" -> "Administratif";
                case "FINANCIER" -> "Financier";
                case "JURIDIQUE" -> "Juridique";
                case "COMMUNICATION" -> "Communication";
                case "FORMATION" -> "Formation";
                case "AUTRE" -> "Autre";
                default -> categorie;
            };
        }
        
        public String getCategorieSeverity() {
            return switch (categorie) {
                case "ADMINISTRATIF" -> "info";
                case "FINANCIER" -> "success";
                case "JURIDIQUE" -> "danger";
                case "COMMUNICATION" -> "warning";
                case "FORMATION" -> "primary";
                case "AUTRE" -> "secondary";
                default -> "secondary";
            };
        }
        
        public String getStatutLibelle() {
            return switch (statut) {
                case "BROUILLON" -> "Brouillon";
                case "VALIDE" -> "Validé";
                case "ARCHIVE" -> "Archivé";
                case "EXPIRE" -> "Expiré";
                default -> statut;
            };
        }
        
        public String getStatutSeverity() {
            return switch (statut) {
                case "BROUILLON" -> "warning";
                case "VALIDE" -> "success";
                case "ARCHIVE" -> "secondary";
                case "EXPIRE" -> "danger";
                default -> "secondary";
            };
        }
        
        public String getTaille() {
            if (tailleBytes < 1024) {
                return tailleBytes + " B";
            } else if (tailleBytes < 1024 * 1024) {
                return Math.round(tailleBytes / 1024.0) + " KB";
            } else {
                return Math.round(tailleBytes / (1024.0 * 1024)) + " MB";
            }
        }
        
        public String getDateCreationFormatee() {
            if (dateCreation == null) return "";
            return dateCreation.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
        }
        
        public String getDateCreationRelative() {
            if (dateCreation == null) return "";
            long jours = ChronoUnit.DAYS.between(dateCreation.toLocalDate(), LocalDate.now());
            if (jours == 0) return "Aujourd'hui";
            if (jours == 1) return "Hier";
            if (jours < 7) return "Il y a " + jours + " jours";
            if (jours < 30) return "Il y a " + (jours / 7) + " semaine" + (jours / 7 > 1 ? "s" : "");
            return "Il y a " + (jours / 30) + " mois";
        }
    }
    
    public static class Dossier {
        private Long id;
        private String nom;
        private String couleur;
        private int nombreDocuments;
        private LocalDateTime derniereModification;
        private String cheminComplet;
        
        // 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 getCouleur() { return couleur; }
        public void setCouleur(String couleur) { this.couleur = couleur; }
        
        public int getNombreDocuments() { return nombreDocuments; }
        public void setNombreDocuments(int nombreDocuments) { this.nombreDocuments = nombreDocuments; }
        
        public LocalDateTime getDerniereModification() { return derniereModification; }
        public void setDerniereModification(LocalDateTime derniereModification) { this.derniereModification = derniereModification; }
        
        public String getCheminComplet() { return cheminComplet; }
        public void setCheminComplet(String cheminComplet) { this.cheminComplet = cheminComplet; }
        
        public String getDerniereModificationRelative() {
            if (derniereModification == null) return "";
            long jours = ChronoUnit.DAYS.between(derniereModification.toLocalDate(), LocalDate.now());
            if (jours == 0) return "aujourd'hui";
            if (jours == 1) return "hier";
            return "il y a " + jours + " jours";
        }
    }
    
    public static class NouveauDocument {
        private String categorie;
        private String description;
        private String motsCles;
        private Long dossierId;
        private boolean accesRestreint;
        
        // Getters et setters
        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 getMotsCles() { return motsCles; }
        public void setMotsCles(String motsCles) { this.motsCles = motsCles; }
        
        public Long getDossierId() { return dossierId; }
        public void setDossierId(Long dossierId) { this.dossierId = dossierId; }
        
        public boolean isAccesRestreint() { return accesRestreint; }
        public void setAccesRestreint(boolean accesRestreint) { this.accesRestreint = accesRestreint; }
    }
    
    public static class Filtres {
        private String nom;
        private String type;
        private String categorie;
        private String statut;
        private String auteur;
        private String motsCles;
        private LocalDate dateDebut;
        private LocalDate dateFin;
        private Double tailleMax;
        
        // Getters et setters
        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 String getCategorie() { return categorie; }
        public void setCategorie(String categorie) { this.categorie = categorie; }
        
        public String getStatut() { return statut; }
        public void setStatut(String statut) { this.statut = statut; }
        
        public String getAuteur() { return auteur; }
        public void setAuteur(String auteur) { this.auteur = auteur; }
        
        public String getMotsCles() { return motsCles; }
        public void setMotsCles(String motsCles) { this.motsCles = motsCles; }
        
        public LocalDate getDateDebut() { return dateDebut; }
        public void setDateDebut(LocalDate dateDebut) { this.dateDebut = dateDebut; }
        
        public LocalDate getDateFin() { return dateFin; }
        public void setDateFin(LocalDate dateFin) { this.dateFin = dateFin; }
        
        public Double getTailleMax() { return tailleMax; }
        public void setTailleMax(Double tailleMax) { this.tailleMax = tailleMax; }
    }
    
    public static class StatistiquesDocuments {
        private int totalDocuments;
        private int totalDossiers;
        private String espaceUtilise;
        private int partagesMois;
        
        // Getters et setters
        public int getTotalDocuments() { return totalDocuments; }
        public void setTotalDocuments(int totalDocuments) { this.totalDocuments = totalDocuments; }
        
        public int getTotalDossiers() { return totalDossiers; }
        public void setTotalDossiers(int totalDossiers) { this.totalDossiers = totalDossiers; }
        
        public String getEspaceUtilise() { return espaceUtilise; }
        public void setEspaceUtilise(String espaceUtilise) { this.espaceUtilise = espaceUtilise; }
        
        public int getPartagesMois() { return partagesMois; }
        public void setPartagesMois(int partagesMois) { this.partagesMois = partagesMois; }
    }
    
    public static class NiveauNavigation {
        private String nom;
        private Long dossierId;
        
        // Getters et setters
        public String getNom() { return nom; }
        public void setNom(String nom) { this.nom = nom; }
        
        public Long getDossierId() { return dossierId; }
        public void setDossierId(Long dossierId) { this.dossierId = dossierId; }
    }
}