"""
Applique un thème clair ou sombre à l'application PySide6 via une QPalette dédiée +
le style Fusion — le seul style Qt qui respecte fidèlement une QPalette
personnalisée (les styles natifs comme Breeze ou Windows11 tirent une partie de
leurs couleurs du thème système et ignorent en partie une palette custom, ce qui
rendrait un mode sombre manuel incomplet). Le thème clair restaure le style et la
palette d'origine capturés au premier appel : aucun changement visuel par rapport
au comportement historique de l'app tant que le mode sombre n'est jamais activé.
"""

from __future__ import annotations

from PySide6.QtGui import QColor, QPalette
from PySide6.QtWidgets import QApplication, QStyleFactory

_original_palette: QPalette | None = None
_original_style_name: str | None = None


def _dark_palette() -> QPalette:
    palette = QPalette()
    dark = QColor(45, 45, 45)
    darker = QColor(30, 30, 30)
    text = QColor(220, 220, 220)
    disabled_text = QColor(127, 127, 127)
    highlight = QColor(42, 130, 218)

    palette.setColor(QPalette.ColorRole.Window, dark)
    palette.setColor(QPalette.ColorRole.WindowText, text)
    palette.setColor(QPalette.ColorRole.Base, darker)
    palette.setColor(QPalette.ColorRole.AlternateBase, dark)
    palette.setColor(QPalette.ColorRole.ToolTipBase, text)
    palette.setColor(QPalette.ColorRole.ToolTipText, text)
    palette.setColor(QPalette.ColorRole.Text, text)
    palette.setColor(QPalette.ColorRole.Button, dark)
    palette.setColor(QPalette.ColorRole.ButtonText, text)
    palette.setColor(QPalette.ColorRole.BrightText, QColor(255, 80, 80))
    palette.setColor(QPalette.ColorRole.Link, highlight)
    palette.setColor(QPalette.ColorRole.Highlight, highlight)
    palette.setColor(QPalette.ColorRole.HighlightedText, darker)
    palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Text, disabled_text)
    palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.ButtonText, disabled_text)
    palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.WindowText, disabled_text)
    return palette


def apply_theme(app: QApplication, theme: str) -> None:
    """
    Applique `theme` ("light" ou "dark") à `app`. Mémorise le style/la palette
    d'origine au tout premier appel (processus entier, pas par instance de
    MainWindow) pour pouvoir restaurer fidèlement "light" ensuite, même après
    plusieurs allers-retours clair/sombre dans la même session.
    """
    global _original_palette, _original_style_name
    if _original_palette is None:
        _original_palette = QPalette(app.palette())
        _original_style_name = app.style().objectName()

    if theme == "dark":
        app.setStyle(QStyleFactory.create("Fusion"))
        app.setPalette(_dark_palette())
    else:
        app.setStyle(QStyleFactory.create(_original_style_name))
        app.setPalette(_original_palette)
