package com.gbcm.client.beans;

import com.gbcm.client.beans.auth.AuthBean;
import jakarta.enterprise.context.SessionScoped;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;

/**
 * Bean JSF pour la gestion de la navigation dans l'interface GBCM
 * 
 * @author GBCM Team
 * @version 1.0.0
 * @since 2025-01-01
 */
@Named("navigationBean")
@SessionScoped
public class NavigationBean implements Serializable {
    
    private static final Logger logger = LoggerFactory.getLogger(NavigationBean.class);
    
    @Inject
    AuthBean authBean;
    
    private String currentPage = "dashboard";
    
    /**
     * Navigation vers le dashboard
     * 
     * @return Outcome de navigation
     */
    public String goToDashboard() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        currentPage = "dashboard";
        logger.debug("Navigation vers le dashboard");
        return "/pages/dashboard?faces-redirect=true";
    }
    
    /**
     * Navigation vers la gestion des utilisateurs
     * 
     * @return Outcome de navigation
     */
    public String goToUsers() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        if (!authBean.isAdmin() && !authBean.isManager()) {
            logger.warn("Accès refusé à la gestion des utilisateurs pour: {}", authBean.getUsername());
            return "/pages/access-denied?faces-redirect=true";
        }
        
        currentPage = "users";
        logger.debug("Navigation vers la gestion des utilisateurs");
        return "/pages/users?faces-redirect=true";
    }
    
    /**
     * Navigation vers la gestion des clients
     * 
     * @return Outcome de navigation
     */
    public String goToClients() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        currentPage = "clients";
        logger.debug("Navigation vers la gestion des clients");
        return "/pages/clients?faces-redirect=true";
    }
    
    /**
     * Navigation vers la gestion des coaches
     * 
     * @return Outcome de navigation
     */
    public String goToCoaches() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        currentPage = "coaches";
        logger.debug("Navigation vers la gestion des coaches");
        return "/pages/coaches?faces-redirect=true";
    }
    
    /**
     * Navigation vers la gestion des ateliers
     * 
     * @return Outcome de navigation
     */
    public String goToWorkshops() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        currentPage = "workshops";
        logger.debug("Navigation vers la gestion des ateliers");
        return "/pages/workshops?faces-redirect=true";
    }
    
    /**
     * Navigation vers les sessions de coaching
     * 
     * @return Outcome de navigation
     */
    public String goToSessions() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        currentPage = "sessions";
        logger.debug("Navigation vers les sessions de coaching");
        return "/pages/sessions?faces-redirect=true";
    }
    
    /**
     * Navigation vers le profil utilisateur
     * 
     * @return Outcome de navigation
     */
    public String goToProfile() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        currentPage = "profile";
        logger.debug("Navigation vers le profil utilisateur");
        return "/pages/profile?faces-redirect=true";
    }
    
    /**
     * Navigation vers les paramètres (admin seulement)
     * 
     * @return Outcome de navigation
     */
    public String goToSettings() {
        if (!authBean.isAuthenticated()) {
            return authBean.login();
        }
        
        if (!authBean.isAdmin()) {
            logger.warn("Accès refusé aux paramètres pour: {}", authBean.getUsername());
            return "/pages/access-denied?faces-redirect=true";
        }
        
        currentPage = "settings";
        logger.debug("Navigation vers les paramètres");
        return "/pages/settings?faces-redirect=true";
    }
    
    /**
     * Vérifie si une page est active
     * 
     * @param page Nom de la page
     * @return true si la page est active
     */
    public boolean isPageActive(String page) {
        return page.equals(currentPage);
    }
    
    /**
     * Récupère la classe CSS pour un élément de menu
     * 
     * @param page Nom de la page
     * @return Classe CSS
     */
    public String getMenuItemClass(String page) {
        return isPageActive(page) ? "ui-state-active" : "";
    }
    
    /**
     * Récupère le titre de la page courante
     * 
     * @return Titre de la page
     */
    public String getPageTitle() {
        switch (currentPage) {
            case "dashboard":
                return "Tableau de Bord";
            case "users":
                return "Gestion des Utilisateurs";
            case "clients":
                return "Gestion des Clients";
            case "coaches":
                return "Gestion des Coaches";
            case "workshops":
                return "Gestion des Ateliers";
            case "sessions":
                return "Sessions de Coaching";
            case "profile":
                return "Mon Profil";
            case "settings":
                return "Paramètres";
            default:
                return "GBCM";
        }
    }
    
    /**
     * Récupère l'icône de la page courante
     * 
     * @return Classe d'icône FontAwesome
     */
    public String getPageIcon() {
        switch (currentPage) {
            case "dashboard":
                return "pi pi-chart-line";
            case "users":
                return "pi pi-users";
            case "clients":
                return "pi pi-briefcase";
            case "coaches":
                return "pi pi-user-plus";
            case "workshops":
                return "pi pi-calendar";
            case "sessions":
                return "pi pi-comments";
            case "profile":
                return "pi pi-user";
            case "settings":
                return "pi pi-cog";
            default:
                return "pi pi-home";
        }
    }
    
    /**
     * Vérifie si l'utilisateur peut accéder à une page
     * 
     * @param page Nom de la page
     * @return true si l'accès est autorisé
     */
    public boolean canAccessPage(String page) {
        if (!authBean.isAuthenticated()) {
            return false;
        }
        
        switch (page) {
            case "users":
            case "settings":
                return authBean.isAdmin() || authBean.isManager();
            case "dashboard":
            case "clients":
            case "coaches":
            case "workshops":
            case "sessions":
            case "profile":
                return true;
            default:
                return false;
        }
    }
    
    // Getters et Setters
    public String getCurrentPage() {
        return currentPage;
    }
    
    public void setCurrentPage(String currentPage) {
        this.currentPage = currentPage;
    }
}
