"""Regression tests for cli.logo rendering, color gating, and stderr emission."""

from __future__ import annotations

import re
from typing import TYPE_CHECKING

from cli.logo import (
    _BRAND_INNER,
    _LOGO_WIDTH,
    _SLOGAN_TEXT,
    _ensure_windows_console,
    _supports_color,
    print_logo,
    render_logo,
)

if TYPE_CHECKING:
    import pytest

_ANSI_ESCAPE_RE = re.compile(r"\033\[[0-9;]*m")


def test_render_logo_color_false_four_lines_border_width_65() -> None:
    output = render_logo(color=False)
    lines = output.splitlines()
    assert len(lines) == 4
    assert len(lines[0]) == 65
    assert lines[0] == "=" * 65
    assert lines[3] == "=" * 65


def test_render_logo_color_true_has_ansi() -> None:
    output = render_logo(color=True)
    assert "\033[" in output


def test_brand_line_centered_in_block() -> None:
    lines = render_logo(color=False).splitlines()
    assert lines[1] == _BRAND_INNER.center(_LOGO_WIDTH)


def test_slogan_line_centered_in_block() -> None:
    lines = render_logo(color=False).splitlines()
    assert lines[2] == _SLOGAN_TEXT.center(_LOGO_WIDTH)


def test_terminal_centering_at_80_cols() -> None:
    lines = render_logo(color=False, terminal_cols=80).splitlines()
    assert all(len(line) == 80 for line in lines)


def test_color_strip_equals_plain() -> None:
    plain_lines = render_logo(color=False).splitlines()
    colored_lines = render_logo(color=True).splitlines()
    for plain, colored in zip(plain_lines, colored_lines, strict=True):
        assert _ANSI_ESCAPE_RE.sub("", colored) == plain


def test_render_logo_no_leading_newline() -> None:
    output = render_logo(color=False)
    assert not output.startswith("\n")


def test_supports_color_not_tty(monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.setattr("sys.stderr.isatty", lambda: False)
    assert _supports_color() is False


def test_supports_color_term_dumb(monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.setattr("sys.stderr.isatty", lambda: True)
    monkeypatch.setenv("TERM", "dumb")
    assert _supports_color() is False


def test_supports_color_term_unknown(monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.setattr("sys.stderr.isatty", lambda: True)
    monkeypatch.setenv("TERM", "unknown")
    assert _supports_color() is False


def test_supports_color_posix_missing_term(monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.setattr("sys.platform", "linux")
    monkeypatch.setattr("sys.stderr.isatty", lambda: True)
    monkeypatch.delenv("TERM", raising=False)
    assert _supports_color() is False


def test_supports_color_win32_without_term(monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.setattr("sys.platform", "win32")
    monkeypatch.setattr("sys.stderr.isatty", lambda: True)
    monkeypatch.delenv("TERM", raising=False)
    assert _supports_color() is True


def test_print_logo_trailing_blank(monkeypatch: pytest.MonkeyPatch) -> None:
    writes: list[str] = []

    def capture_write(data: str) -> None:
        writes.append(data)

    monkeypatch.setattr("sys.stderr.write", capture_write)
    monkeypatch.setattr("cli.logo._supports_color", lambda: False)
    monkeypatch.setattr("cli.logo._terminal_cols", lambda: 80)

    print_logo()

    assert len(writes) == 2
    assert writes[1] == "\n\n"


def test_windows_console_init_once(monkeypatch: pytest.MonkeyPatch) -> None:
    _ensure_windows_console.cache_clear()
    call_count = 0

    def mock_fix() -> None:
        nonlocal call_count
        call_count += 1

    import colorama

    monkeypatch.setattr("sys.platform", "win32")
    monkeypatch.setattr(colorama, "just_fix_windows_console", mock_fix)
    monkeypatch.setattr("cli.logo._supports_color", lambda: False)
    monkeypatch.setattr("cli.logo._terminal_cols", lambda: 80)
    monkeypatch.setattr("sys.stderr.write", lambda _: None)

    print_logo()
    print_logo()

    assert call_count == 1
    _ensure_windows_console.cache_clear()