package com.gbcm.client.beans;

import jakarta.enterprise.context.SessionScoped;
import jakarta.inject.Named;
import java.io.Serializable;

/**
 * Bean pour les préférences d'affichage du template Freya
 * Compatible avec le template Freya 5.0.0 original
 * 
 * @author GBCM Team
 * @version 1.0.0
 * @since 2025-01-01
 */
@Named("guestPreferences")
@SessionScoped
public class GuestPreferences implements Serializable {
    
    private String layout = "layout-light";
    private String menuTheme = "light";
    private String topbarTheme = "light";
    private String menuMode = "static";
    private String inputStyleClass = "";
    private boolean lightLogo = false;
    
    /**
     * Récupère le layout CSS (light/dark)
     * 
     * @return Nom du fichier CSS de layout
     */
    public String getLayout() {
        return layout;
    }
    
    /**
     * Définit le layout CSS
     * 
     * @param layout Nom du layout (layout-light ou layout-dark)
     */
    public void setLayout(String layout) {
        this.layout = layout;
        // Ajuster le logo selon le thème
        this.lightLogo = "layout-dark".equals(layout);
    }
    
    /**
     * Récupère le thème du menu
     * 
     * @return Thème du menu (light/dark)
     */
    public String getMenuTheme() {
        return menuTheme;
    }
    
    /**
     * Définit le thème du menu
     * 
     * @param menuTheme Thème du menu
     */
    public void setMenuTheme(String menuTheme) {
        this.menuTheme = menuTheme;
    }
    
    /**
     * Récupère le thème de la topbar
     * 
     * @return Thème de la topbar (light/dark)
     */
    public String getTopbarTheme() {
        return topbarTheme;
    }
    
    /**
     * Définit le thème de la topbar
     * 
     * @param topbarTheme Thème de la topbar
     */
    public void setTopbarTheme(String topbarTheme) {
        this.topbarTheme = topbarTheme;
    }
    
    /**
     * Récupère le mode du menu
     * 
     * @return Mode du menu (static/overlay/horizontal)
     */
    public String getMenuMode() {
        return menuMode;
    }
    
    /**
     * Définit le mode du menu
     * 
     * @param menuMode Mode du menu
     */
    public void setMenuMode(String menuMode) {
        this.menuMode = menuMode;
    }
    
    /**
     * Récupère la classe CSS pour le style des inputs
     * 
     * @return Classe CSS
     */
    public String getInputStyleClass() {
        return inputStyleClass;
    }
    
    /**
     * Définit la classe CSS pour le style des inputs
     * 
     * @param inputStyleClass Classe CSS
     */
    public void setInputStyleClass(String inputStyleClass) {
        this.inputStyleClass = inputStyleClass;
    }
    
    /**
     * Indique si le logo light doit être utilisé
     * 
     * @return true pour le logo light
     */
    public boolean isLightLogo() {
        return lightLogo;
    }
    
    /**
     * Définit l'utilisation du logo light
     * 
     * @param lightLogo true pour utiliser le logo light
     */
    public void setLightLogo(boolean lightLogo) {
        this.lightLogo = lightLogo;
    }
    
    /**
     * Bascule vers le thème sombre
     */
    public void switchToDark() {
        setLayout("layout-dark");
        setMenuTheme("dark");
        setTopbarTheme("dark");
    }
    
    /**
     * Bascule vers le thème clair
     */
    public void switchToLight() {
        setLayout("layout-light");
        setMenuTheme("light");
        setTopbarTheme("light");
    }
    
    /**
     * Vérifie si le thème sombre est actif
     * 
     * @return true si thème sombre
     */
    public boolean isDarkTheme() {
        return "layout-dark".equals(layout);
    }
    
    /**
     * Vérifie si le thème clair est actif
     * 
     * @return true si thème clair
     */
    public boolean isLightTheme() {
        return "layout-light".equals(layout);
    }
    
    /**
     * Récupère la classe CSS complète pour le body
     * 
     * @return Classes CSS combinées
     */
    public String getBodyStyleClass() {
        StringBuilder sb = new StringBuilder();
        sb.append(inputStyleClass);
        if (isDarkTheme()) {
            sb.append(" dark-theme");
        }
        return sb.toString().trim();
    }
    
    /**
     * Récupère l'icône pour le bouton de basculement de thème
     * 
     * @return Classe d'icône
     */
    public String getThemeToggleIcon() {
        return isDarkTheme() ? "pi pi-sun" : "pi pi-moon";
    }
    
    /**
     * Récupère le texte pour le bouton de basculement de thème
     * 
     * @return Texte du bouton
     */
    public String getThemeToggleText() {
        return isDarkTheme() ? "Mode Clair" : "Mode Sombre";
    }
    
    /**
     * Bascule entre les thèmes clair et sombre
     */
    public void toggleTheme() {
        if (isDarkTheme()) {
            switchToLight();
        } else {
            switchToDark();
        }
    }
    
    /**
     * Réinitialise les préférences aux valeurs par défaut
     */
    public void resetToDefaults() {
        layout = "layout-light";
        menuTheme = "light";
        topbarTheme = "light";
        menuMode = "static";
        inputStyleClass = "";
        lightLogo = false;
    }
}
