from __future__ import annotations

import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

from ui.dashboard import Dashboard
from ui.style import apply_theme_class, remove_css_class
from ui.theme import normalize_theme_preference, resolve_theme
from ui.view_model import DashboardCallbacks


def test_normalize_theme_preference() -> None:
    assert normalize_theme_preference("dark") == "dark"
    assert normalize_theme_preference("light") == "light"
    assert normalize_theme_preference("system") == "system"
    assert normalize_theme_preference("neon") == "system"
    assert normalize_theme_preference(None) == "system"


def test_resolve_theme_forced_and_system() -> None:
    assert resolve_theme("dark", system_is_dark=lambda: False) == "dark"
    assert resolve_theme("light", system_is_dark=lambda: True) == "light"
    assert resolve_theme("system", system_is_dark=lambda: True) == "dark"
    assert resolve_theme("system", system_is_dark=lambda: False) == "light"
    assert resolve_theme("bogus", system_is_dark=lambda: True) == "dark"


def test_apply_theme_class_swaps() -> None:
    class Widget:
        def __init__(self) -> None:
            self.css_classes: list[str] = ["dashboard"]

    widget = Widget()
    apply_theme_class(widget, "dark")
    assert "theme-dark" in widget.css_classes
    assert "theme-light" not in widget.css_classes
    apply_theme_class(widget, "light")
    assert "theme-light" in widget.css_classes
    assert "theme-dark" not in widget.css_classes
    remove_css_class(widget, "theme-light")
    assert "theme-light" not in widget.css_classes


def test_dashboard_set_theme_updates_css_classes() -> None:
    callbacks = DashboardCallbacks(
        on_set_default=lambda _tool, _slug: None,
        on_reload=lambda _tool, _slug: None,
        on_repair=lambda _tool, _slug: None,
        on_rename=lambda _tool, _slug: None,
        on_remove=lambda _tool, _slug: None,
        on_add=lambda _tool: None,
        on_open_settings=lambda: None,
        on_set_limits=lambda _tool, _slug: None,
        on_tab_changed=lambda _tab_id: None,
    )
    from ui.dashboard import _FallbackGtk

    dash = Dashboard(callbacks, gtk_module=_FallbackGtk)
    assert "theme-light" in dash.widget.css_classes
    dash.set_theme("dark")
    assert "theme-dark" in dash.widget.css_classes
    assert "theme-light" not in dash.widget.css_classes
