#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ///////////////////////////////////////////////////////////////

"""
Script principal pour lancer tous les exemples de widgets EzQt_Widgets.

Ce script permet de choisir et lancer n'importe quel exemple de widget
disponible dans le dossier examples.
"""

import sys
import os
import re
import yaml

# Ajouter le dossier courant au path pour les imports relatifs
current_dir = os.path.dirname(os.path.abspath(__file__))
if current_dir not in sys.path:
    sys.path.insert(0, current_dir)

from PySide6.QtCore import Qt, QTimer
from PySide6.QtGui import QFont, QIcon, QPixmap
from PySide6.QtWidgets import (
    QApplication,
    QMainWindow,
    QWidget,
    QVBoxLayout,
    QHBoxLayout,
    QLabel,
    QPushButton,
    QGroupBox,
    QMessageBox,
    QStackedWidget,
    QFrame,
)

# Import des widgets d'exemple
from button_example import ButtonExampleWidget
from input_example import InputExampleWidget
from label_example import LabelExampleWidget
from misc_example import MiscExampleWidget


def load_and_apply_qss(app, qss_path, yaml_path, theme_name="dark"):
    """Fonction utilitaire pour charger et appliquer le QSS avec variables."""
    try:
        # Charger les variables du thème depuis le YAML
        with open(yaml_path, encoding="utf-8") as f:
            config = yaml.safe_load(f)
        theme_vars = config["theme_palette"][theme_name]

        # Charger le QSS
        with open(qss_path, encoding="utf-8") as f:
            qss = f.read()

        # Remplacer les variables $ par leur valeur
        def repl(match):
            var = match.group(0)
            return theme_vars.get(var, var)

        qss = re.sub(r"\$_[a-zA-Z0-9_]+", repl, qss)
        app.setStyleSheet(qss)
        print(f"Thème '{theme_name}' chargé avec succès")

    except Exception as e:
        print(f"Erreur lors du chargement du thème: {e}")
        # Appliquer un style par défaut en cas d'erreur
        app.setStyleSheet("")


class EzQtExamplesLauncher(QMainWindow):
    """Launcher principal pour tous les exemples EzQt_Widgets."""

    def __init__(self):
        super().__init__()
        self.setWindowTitle("EzQt_Widgets - Launcher d'Exemples")
        self.setMinimumSize(1200, 800)
        self.setup_ui()
        self.setup_theme()

    def setup_ui(self):
        """Configure l'interface utilisateur."""
        # Widget central
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # Layout principal
        main_layout = QVBoxLayout(central_widget)
        main_layout.setSpacing(0)
        main_layout.setContentsMargins(0, 0, 0, 0)

        # Header avec titre et navigation
        self.setup_header(main_layout)

        # Zone de contenu avec stacked widget
        self.setup_content_area(main_layout)

        # Footer avec informations
        self.setup_footer(main_layout)

    def setup_header(self, main_layout):
        """Configure l'en-tête avec navigation."""
        # Header container
        header_frame = QFrame()
        header_frame.setObjectName("header")
        header_frame.setFixedHeight(120)
        header_layout = QVBoxLayout(header_frame)
        header_layout.setContentsMargins(20, 15, 20, 15)

        # Titre principal
        title = QLabel("EzQt_Widgets - Démonstration Complète")
        title.setFont(QFont("Segoe UI", 20, QFont.Bold))
        title.setAlignment(Qt.AlignCenter)
        title.setObjectName("main-title")
        header_layout.addWidget(title)

        # Sous-titre
        subtitle = QLabel("Sélectionnez une catégorie pour explorer les widgets")
        subtitle.setFont(QFont("Segoe UI", 12))
        subtitle.setAlignment(Qt.AlignCenter)
        subtitle.setObjectName("subtitle")
        header_layout.addWidget(subtitle)

        # Barre de navigation
        nav_frame = QFrame()
        nav_frame.setObjectName("nav-bar")
        nav_layout = QHBoxLayout(nav_frame)
        nav_layout.setSpacing(10)
        nav_layout.setContentsMargins(0, 10, 0, 0)

        # Boutons de navigation
        self.nav_buttons = {}
        nav_items = [
            ("buttons", "Boutons", "🎯"),
            ("inputs", "Inputs", "⌨️"),
            ("labels", "Labels", "🏷️"),
            ("misc", "Misc", "🔧"),
        ]

        # Créer les widgets d'exemple d'abord pour savoir lesquels sont disponibles
        self.example_widgets = {}

        try:
            self.example_widgets["buttons"] = ButtonExampleWidget()
        except Exception as e:
            print(f"Erreur lors du chargement de ButtonExampleWidget: {e}")

        try:
            self.example_widgets["inputs"] = InputExampleWidget()
        except Exception as e:
            print(f"Erreur lors du chargement de InputExampleWidget: {e}")

        try:
            self.example_widgets["labels"] = LabelExampleWidget()
        except Exception as e:
            print(f"Erreur lors du chargement de LabelExampleWidget: {e}")

        try:
            self.example_widgets["misc"] = MiscExampleWidget()
        except Exception as e:
            print(f"Erreur lors du chargement de MiscExampleWidget: {e}")

        # Créer les boutons de navigation seulement pour les widgets disponibles
        for key, text, icon in nav_items:
            if key in self.example_widgets and self.example_widgets[key] is not None:
                btn = QPushButton(f"{icon} {text}")
                btn.setObjectName("nav-button")
                btn.setCheckable(True)
                btn.clicked.connect(lambda checked, k=key: self.switch_to_example(k))
                nav_layout.addWidget(btn)
                self.nav_buttons[key] = btn

        # Bouton actif par défaut (premier disponible)
        if self.nav_buttons:
            first_key = list(self.nav_buttons.keys())[0]
            self.nav_buttons[first_key].setChecked(True)

        header_layout.addWidget(nav_frame)
        main_layout.addWidget(header_frame)

    def setup_content_area(self, main_layout):
        """Configure la zone de contenu."""
        # Container pour le contenu
        content_frame = QFrame()
        content_frame.setObjectName("content-area")
        content_layout = QVBoxLayout(content_frame)
        content_layout.setContentsMargins(20, 20, 20, 20)

        # Stacked widget pour les exemples
        self.stacked_widget = QStackedWidget()
        self.stacked_widget.setObjectName("stacked-content")

        # Ajout des widgets au stacked widget
        for key, widget in self.example_widgets.items():
            if widget is not None:
                self.stacked_widget.addWidget(widget)

        content_layout.addWidget(self.stacked_widget)
        main_layout.addWidget(content_frame)

    def setup_footer(self, main_layout):
        """Configure le pied de page."""
        # Footer container
        footer_frame = QFrame()
        footer_frame.setObjectName("footer")
        footer_frame.setFixedHeight(60)
        footer_layout = QHBoxLayout(footer_frame)
        footer_layout.setContentsMargins(20, 10, 20, 10)

        # Informations de version
        version_info = QLabel(
            "EzQt_Widgets v1.0.0 - Bibliothèque de widgets Qt personnalisés"
        )
        version_info.setObjectName("footer-text")
        footer_layout.addWidget(version_info)

        # Boutons d'action
        action_layout = QHBoxLayout()
        action_layout.setSpacing(10)

        help_btn = QPushButton("Aide")
        help_btn.setObjectName("footer-button")
        help_btn.clicked.connect(self.show_help)
        action_layout.addWidget(help_btn)

        about_btn = QPushButton("À propos")
        about_btn.setObjectName("footer-button")
        about_btn.clicked.connect(self.show_about)
        action_layout.addWidget(about_btn)

        footer_layout.addLayout(action_layout)
        main_layout.addWidget(footer_frame)

    def setup_theme(self):
        """Configure le thème global de l'application."""
        # Chemin vers les fichiers de thème
        bin_dir = os.path.join(os.path.dirname(__file__), "bin")
        qss_path = os.path.join(bin_dir, "main_theme.qss")
        yaml_path = os.path.join(bin_dir, "app.yaml")

        # Charger le thème depuis les fichiers
        if os.path.exists(qss_path) and os.path.exists(yaml_path):
            load_and_apply_qss(self, qss_path, yaml_path, theme_name="dark")
        else:
            # Style par défaut si les fichiers de thème ne sont pas trouvés
            self.setStyleSheet(
                """
                QMainWindow {
                    background-color: #f8f9fa;
                }
                QGroupBox {
                    font-weight: bold;
                    border: 2px solid #e9ecef;
                    border-radius: 8px;
                    margin-top: 1ex;
                    padding-top: 15px;
                    background-color: #f8f9fa;
                }
                QPushButton {
                    background-color: #3498db;
                    border: none;
                    color: white;
                    padding: 10px 20px;
                    text-align: center;
                    font-size: 14px;
                    font-weight: bold;
                    border-radius: 6px;
                    min-width: 100px;
                }
                QPushButton:hover {
                    background-color: #2980b9;
                }
                QLabel {
                    color: #2c3e50;
                    font-size: 13px;
                }
            """
            )

    def switch_to_example(self, example_key):
        """Change vers l'exemple sélectionné."""
        # Mise à jour des boutons de navigation
        for key, btn in self.nav_buttons.items():
            btn.setChecked(key == example_key)

        # Changement du widget affiché
        if example_key in self.example_widgets:
            self.stacked_widget.setCurrentWidget(self.example_widgets[example_key])
            print(f"Changement vers l'exemple: {example_key}")

    def show_help(self):
        """Affiche l'aide."""
        help_text = """
        <h3>Guide d'utilisation - EzQt_Widgets</h3>
        
        <p><b>Navigation :</b></p>
        <ul>
            <li>Utilisez les boutons de navigation en haut pour changer d'exemple</li>
            <li>Chaque exemple démontre une catégorie de widgets</li>
            <li>Interagissez avec les widgets pour voir leurs fonctionnalités</li>
        </ul>
        
        <p><b>Catégories disponibles :</b></p>
        <ul>
            <li><b>Boutons :</b> DateButton, IconButton, LoaderButton</li>
            <li><b>Inputs :</b> TabReplaceTextEdit, AutoCompleteInput, SearchInput, PasswordInput</li>
            <li><b>Labels :</b> FramedLabel, IndicatorLabel, HoverLabel, ClickableTagLabel</li>
            <li><b>Misc :</b> OptionSelector, CircularTimer, ToggleIcon, ToggleSwitch, DraggableList</li>
        </ul>
        
        <p><b>Tests :</b></p>
        <ul>
            <li>Utilisez les boutons "Test" pour voir les interactions</li>
            <li>Les boutons "Reset" remettent tout à zéro</li>
        </ul>
        """

        QMessageBox.information(self, "Aide - EzQt_Widgets", help_text)

    def show_about(self):
        """Affiche les informations à propos."""
        about_text = """
        <h3>EzQt_Widgets v1.0.0</h3>
        
        <p>Bibliothèque de widgets Qt personnalisés pour PySide6.</p>
        
        <p><b>Fonctionnalités :</b></p>
        <ul>
            <li>Widgets de boutons avancés</li>
            <li>Champs de saisie spécialisés</li>
            <li>Labels interactifs</li>
            <li>Widgets utilitaires divers</li>
        </ul>
        
        <p><b>Compatibilité :</b> PySide6</p>
        <p><b>Licence :</b> MIT</p>
        
        <p>Développé pour simplifier la création d'interfaces Qt modernes.</p>
        """

        QMessageBox.about(self, "À propos - EzQt_Widgets", about_text)

    def closeEvent(self, event):
        """Gestion de la fermeture de l'application."""
        reply = QMessageBox.question(
            self,
            "Confirmation",
            "Voulez-vous vraiment quitter la démonstration ?",
            QMessageBox.Yes | QMessageBox.No,
            QMessageBox.No,
        )

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    """Fonction principale."""
    app = QApplication(sys.argv)

    # Configuration de l'application
    app.setApplicationName("EzQt_Widgets Examples")
    app.setApplicationVersion("1.0.0")
    app.setOrganizationName("EzQt_Widgets")

    # Création et affichage de la fenêtre principale
    window = EzQtExamplesLauncher()
    window.show()

    # Exécution de l'application
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
