"""UI 渲染器外部入口。abyss 唯一主题 = Hacker（复古 CRT 风格）。"""
from __future__ import annotations

import threading
from typing import TYPE_CHECKING, Optional

from .renderer import BaseRenderer, DefaultRenderer, HackerRenderer
from .themes import Theme, resolve_theme

if TYPE_CHECKING:
    from abyss.config.legacy import Config


_global_renderer: Optional[BaseRenderer] = None
_global_cfg: Optional["Config"] = None
_lock = threading.Lock()


def _make_renderer(cfg: "Config") -> BaseRenderer:
    """强制构造 HackerRenderer（abyss 唯一主题。resolve_theme 恒返回 HACKER）。"""
    return HackerRenderer(cfg)


def get_theme_renderer(cfg: Optional["Config"] = None) -> BaseRenderer:
    """构造全局 HackerRenderer（传 cfg 初始化；不传则返回上次构造的实例）。

    Args:
        cfg: 传 None 时返回上次构造的全局 renderer。首次调用前必须至少传过一次 cfg，
            否则抛出 RuntimeError。
    """
    global _global_renderer, _global_cfg
    if cfg is None:
        with _lock:
            if _global_renderer is None:
                raise RuntimeError(
                    "get_theme_renderer(cfg=None) 调用时还未初始化过 renderer。"
                    "请先在 main.py 启动阶段传 cfg 调用一次。"
                )
            return _global_renderer
    # 只返回 HackerRenderer（无论 cfg.ui.theme 填什么，都已在 Theme.from_string 归一化）
    new_r = _make_renderer(cfg)
    with _lock:
        _global_cfg = cfg
        _global_renderer = new_r
    return new_r


def get_current_renderer() -> BaseRenderer:
    """获取上次初始化/更新的全局 renderer（恒为 HackerRenderer）。"""
    if _global_renderer is None:
        # 保护：测试里未初始化时回退 HackerRenderer（之前回退 DefaultRenderer；现主题唯一）
        return HackerRenderer.__new__(HackerRenderer)
    return _global_renderer


__all__ = [
    "BaseRenderer",
    "DefaultRenderer",   # 保留导出：main.py 里 isinstance 检查需存在（HackerRenderer 外的分支现在永远不走）
    "HackerRenderer",
    "Theme",
    "get_theme_renderer",
    "get_current_renderer",
]
