"""Tests for BigTitle and font rendering."""

import uframe
from uframe.fonts import render_big_text, get_text_width, FONTS, FONT_HEIGHTS


# ---------------------------------------------------------------------------
# Unit tests for font module
# ---------------------------------------------------------------------------


def test_font_registry():
    assert "block" in FONTS
    assert "thin" in FONTS
    assert "pixel" in FONTS


def test_font_heights():
    assert FONT_HEIGHTS["block"] == 6
    assert FONT_HEIGHTS["thin"] == 3
    assert FONT_HEIGHTS["pixel"] == 3


def test_render_big_text_block():
    lines = render_big_text("HI", "block")
    assert len(lines) == 6
    # Should contain block characters
    assert any("█" in line for line in lines)


def test_render_big_text_thin():
    lines = render_big_text("AB", "thin")
    assert len(lines) == 3
    assert any("┌" in line or "├" in line for line in lines)


def test_render_big_text_pixel():
    lines = render_big_text("OK", "pixel")
    assert len(lines) == 3
    assert any("▀" in line or "█" in line for line in lines)


def test_get_text_width():
    w = get_text_width("A", "block")
    assert w > 0
    w2 = get_text_width("AB", "block")
    assert w2 > w  # two chars wider than one


def test_kerning():
    w_tight = get_text_width("AB", "block", kerning=0)
    w_normal = get_text_width("AB", "block", kerning=1)
    w_wide = get_text_width("AB", "block", kerning=2)
    assert w_tight < w_normal < w_wide


# ---------------------------------------------------------------------------
# Integration tests — bigtitle through compile pipeline
# ---------------------------------------------------------------------------


def test_bigtitle_block_font():
    source = '''page "Test" 80
  bigtitle "HI" block'''
    result = uframe.compile(source)
    assert "█" in result.ascii
    lines = result.ascii.strip().split("\n")
    assert len(lines) >= 6  # block font is 6 lines tall


def test_bigtitle_thin_font():
    source = '''page "Test" 80
  bigtitle "OK" thin'''
    result = uframe.compile(source)
    # Thin font uses box-drawing characters
    assert any(c in result.ascii for c in "┌├┐┘└┬")


def test_bigtitle_pixel_font():
    source = '''page "Test" 80
  bigtitle "GO" pixel'''
    result = uframe.compile(source)
    assert any(c in result.ascii for c in "▀▄█")


def test_bigtitle_fallback_to_smaller_font():
    """When text is too wide for block font, should fall back to smaller fonts."""
    source = '''page "Test" 40
  bigtitle "ABCDEFGHIJ" block'''
    result = uframe.compile(source)
    # Should still render with a fallback font (thin uses box-drawing)
    assert result.ascii.strip() != ""
    # Thin font characters should be present (fell back from block)
    assert any(c in result.ascii for c in "┌├┐┘└┬─")


def test_bigtitle_with_alignment():
    source = '''page "Test" 80
  bigtitle "HI" block
    align center'''
    result = uframe.compile(source)
    assert "█" in result.ascii
