package dev.lions.freya.demo;

import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.SessionScoped;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Named;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Bean pour gérer la sélection du thème Freya.
 *
 * Freya propose 8 couleurs principales (avocado, blue, green, orange, purple, red,
 * turquoise, yellow)
 * et 2 modes (light, dark).
 */
@Named("themeSelectorBean")
@SessionScoped
public class ThemeSelectorBean implements Serializable {

    private static final long serialVersionUID = 1L;

    // Couleurs Freya disponibles (officielles)
    private static final String[] AVAILABLE_COLORS = {
            "avocado", "blue", "green", "orange", "purple", "red", "turquoise", "yellow"
    };

    // Modes disponibles
    private static final String MODE_LIGHT = "light";
    private static final String MODE_DARK = "dark";

    // État actuel
    private String selectedColor = "blue"; // Couleur par défaut
    private String selectedMode = MODE_LIGHT; // Mode par défaut

    @PostConstruct
    public void init() {
        // On pourrait charger depuis les cookies ou localStorage via JavaScript
        // Pour l'instant, on utilise les valeurs par défaut
    }

    /**
     * Retourne le nom CSS complet du thème actuel.
     * Format: "primefaces-freya-{color}-{mode}/theme.css"
     */
    public String getCurrentLayoutCss() {
        return "freya-layout/css/layout-" + selectedMode + ".css";
    }

    public String getCurrentThemeCss() {
        return "primefaces-freya-" + selectedColor + "-" + selectedMode + "/theme.css";
    }

    /**
     * Change la couleur du thème.
     */
    public void changeColor(String color) {
        if (isValidColor(color)) {
            this.selectedColor = color;
        }
    }

    /**
     * Toggle entre light et dark mode.
     */
    public void toggleMode() {
        this.selectedMode = MODE_LIGHT.equals(selectedMode) ? MODE_DARK : MODE_LIGHT;
    }

    /**
     * Change le mode (appelé par AJAX, la valeur est déjà bindée).
     */
    public void changeMode() {
        // La valeur selectedMode est déjà mise à jour par le binding
        // Cette méthode sert juste de listener pour le refresh
    }

    /**
     * Valide qu'une couleur est disponible.
     */
    private boolean isValidColor(String color) {
        for (String availableColor : AVAILABLE_COLORS) {
            if (availableColor.equals(color)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Retourne la liste des couleurs disponibles pour l'UI (couleurs officielles Freya).
     */
    public List<ThemeColor> getAvailableColors() {
        List<ThemeColor> colors = new ArrayList<>();
        colors.add(new ThemeColor("avocado", "Avocado", "#9CCC65"));
        colors.add(new ThemeColor("blue", "Blue", "#42A5F5"));
        colors.add(new ThemeColor("green", "Green", "#66BB6A"));
        colors.add(new ThemeColor("orange", "Orange", "#FFA726"));
        colors.add(new ThemeColor("purple", "Purple", "#AB47BC"));
        colors.add(new ThemeColor("red", "Red", "#EF5350"));
        colors.add(new ThemeColor("turquoise", "Turquoise", "#26A69A"));
        colors.add(new ThemeColor("yellow", "Yellow", "#FFEE58"));
        return colors;
    }

    // ========================================
    // Getters / Setters
    // ========================================

    public String getSelectedColor() {
        return selectedColor;
    }

    public void setSelectedColor(String selectedColor) {
        this.selectedColor = selectedColor;
    }

    public String getSelectedMode() {
        return selectedMode;
    }

    public void setSelectedMode(String selectedMode) {
        this.selectedMode = selectedMode;
    }

    public boolean isLightMode() {
        return MODE_LIGHT.equals(selectedMode);
    }

    public boolean isDarkMode() {
        return MODE_DARK.equals(selectedMode);
    }

    /**
     * Classe interne pour représenter une couleur de thème.
     */
    public static class ThemeColor implements Serializable {
        private static final long serialVersionUID = 1L;

        private String code;
        private String label;
        private String hexColor;

        public ThemeColor(String code, String label, String hexColor) {
            this.code = code;
            this.label = label;
            this.hexColor = hexColor;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getLabel() {
            return label;
        }

        public void setLabel(String label) {
            this.label = label;
        }

        public String getHexColor() {
            return hexColor;
        }

        public void setHexColor(String hexColor) {
            this.hexColor = hexColor;
        }
    }
}
