"""主题枚举、配置解析、终端环境降级检测。"""
from __future__ import annotations

import os
import shutil
from enum import Enum
from typing import TYPE_CHECKING, Optional

if TYPE_CHECKING:
    from abyss.config.legacy import Config


class Theme(str, Enum):
    """主题枚举。abyss 已锁定唯一主题 = HACKER（复古 CRT 风格）。保留 DEFAULT 枚举值仅用于向后兼容旧引用（实际解析会归一化到 HACKER）。"""
    DEFAULT = "default"   # 保留占位：所有非 hacker 输入都归一化到 HACKER
    HACKER = "hacker"

    @classmethod
    def from_string(cls, value: Optional[str]) -> "Theme":
        """无论输入什么都返回 HACKER（唯一主题锁定）。"""
        return cls.HACKER


# 配置键常量（保持与 Config.DEFAULTS 一致）
CFG_KEY_THEME = "ui.theme"
CFG_KEY_CRT_SCANLINE = "ui.hacker.use_crt_scanline"
# 终端 cols 阈值：低于此值 hacker theme 自动启用 compact banner（不画 ASCII LOGO 防折行）
COMPACT_COLS_THRESHOLD = 60


def get_term_cols(fallback: int = 80) -> int:
    """获取当前终端列数。非 tty 环境返回 fallback。"""
    try:
        cols = shutil.get_terminal_size(fallback=(fallback, 24)).columns
        return int(cols) if cols > 0 else fallback
    except Exception:
        return fallback


def resolve_theme(cfg: "Config") -> Theme:
    """根据配置 + 终端环境解析最终主题。若配置不合法，回退 DEFAULT。"""
    raw = cfg.get(CFG_KEY_THEME)
    theme = Theme.from_string(raw)
    return theme


def is_hacker_compact(cols: Optional[int] = None) -> bool:
    """Hacker 主题是否需要 compact 模式（小终端不画大 ASCII LOGO）。"""
    c = cols if cols is not None else get_term_cols()
    return c < COMPACT_COLS_THRESHOLD


def is_windows_terminal() -> bool:
    """是否在 Windows Terminal (WT_SESSION) 中运行 — 非严格，仅用于未来扩展。"""
    return bool(os.environ.get("WT_SESSION"))
