"""Tests for the theme system."""

import uframe
from uframe.themes import (
    get_theme, ThemeDef, BUILTIN_THEMES,
    THEME_DEFAULT, THEME_NOUVEAU, THEME_GOTHIC,
    THEME_BAMBOO, THEME_CIRCUIT, THEME_BRUTALIST,
)


# ---------------------------------------------------------------------------
# Theme registry
# ---------------------------------------------------------------------------


def test_builtin_themes_exist():
    assert len(BUILTIN_THEMES) == 6
    for name in ("default", "nouveau", "gothic", "bamboo", "circuit", "brutalist"):
        assert name in BUILTIN_THEMES


def test_get_theme_by_name():
    theme = get_theme("gothic")
    assert theme.name == "gothic"


def test_get_theme_case_insensitive():
    theme = get_theme("GOTHIC")
    assert theme.name == "gothic"


def test_get_theme_unknown_returns_default():
    theme = get_theme("nonexistent")
    assert theme.name == "default"


# ---------------------------------------------------------------------------
# Theme structure
# ---------------------------------------------------------------------------


def test_theme_has_all_fields():
    for name, theme in BUILTIN_THEMES.items():
        assert theme.borders_light is not None
        assert theme.borders_heavy is not None
        assert theme.borders_double is not None
        assert theme.borders_rounded is not None
        assert theme.dividers is not None
        assert theme.indicators is not None
        assert theme.gauge is not None
        assert theme.form is not None
        assert theme.palette is not None


def test_border_chars_method():
    theme = THEME_DEFAULT
    bc = theme.border_chars("light")
    assert bc.tl == "┌"
    assert bc.tr == "┐"


def test_border_dict_method():
    theme = THEME_DEFAULT
    bd = theme.border_dict("double")
    assert bd["tl"] == "╔"
    assert bd["h"] == "═"


# ---------------------------------------------------------------------------
# Themed rendering — each theme produces correct characters
# ---------------------------------------------------------------------------


def test_compile_with_default_theme():
    source = '''page "Test" 40
  box light "Panel"
    text "Content"'''
    result = uframe.compile(source)
    assert "┌" in result.ascii  # default light border


def test_compile_with_gothic_theme():
    source = '''page "Test" 40
  box light "Panel"
    text "Content"'''
    result = uframe.compile(source, theme="gothic")
    # Gothic uses double-style borders for light
    assert "╔" in result.ascii


def test_compile_with_brutalist_theme():
    source = '''page "Test" 40
  box light "Panel"
    text "Content"'''
    result = uframe.compile(source, theme="brutalist")
    # Brutalist uses block characters for light borders
    assert "▛" in result.ascii


def test_compile_with_bamboo_theme():
    source = '''page "Test" 40
  box light "Panel"
    text "Content"'''
    result = uframe.compile(source, theme="bamboo")
    # Bamboo uses dashed light borders
    assert "╌" in result.ascii or "┌" in result.ascii


def test_compile_with_circuit_theme():
    source = '''page "Test" 40
  gauge "CPU" 50 100 20'''
    result = uframe.compile(source, theme="circuit")
    # Circuit uses ▰/▱ for gauge
    assert "▰" in result.ascii
    assert "▱" in result.ascii


def test_compile_with_nouveau_theme():
    source = '''page "Test" 40
  status "Server" online'''
    result = uframe.compile(source, theme="nouveau")
    # Nouveau uses ❀ for online indicator
    assert "❀" in result.ascii


def test_theme_divider_chars():
    source = '''page "Test" 40
  divider heavy'''
    result_default = uframe.compile(source)
    result_gothic = uframe.compile(source, theme="gothic")
    # Both should render but potentially with different chars
    assert "━" in result_default.ascii
    assert "═" in result_gothic.ascii


def test_theme_gauge_chars():
    source = '''page "Test" 40
  gauge "Test" 50 100 20'''
    result_default = uframe.compile(source)
    result_brutalist = uframe.compile(source, theme="brutalist")
    # Default: █/░, Brutalist: █/(space)
    assert "█" in result_default.ascii
    assert "█" in result_brutalist.ascii


def test_theme_form_chars():
    source = '''page "Test" 50
  form "test"
    checkbox "agree" "Accept"'''
    result_default = uframe.compile(source)
    result_gothic = uframe.compile(source, theme="gothic")
    # Default: [ ], Gothic: ⚐
    assert "[ ]" in result_default.ascii or "Accept" in result_default.ascii
    assert "⚐" in result_gothic.ascii or "Accept" in result_gothic.ascii
