"""结构化日志:同时落盘(轮转)与输出控制台。关键路径用它记录(PRD §10)。

通过日志落盘做 debug——文件在 logs/genesis.log,带时间戳/级别/模块/上下文。
"""

from __future__ import annotations

import logging
from logging.handlers import RotatingFileHandler
from pathlib import Path

_PROJECT_ROOT = Path(__file__).resolve().parents[2]
_LOG_DIR = _PROJECT_ROOT / "logs"
_FMT = "%(asctime)s | %(levelname)-5s | %(name)s | %(message)s"
_configured = False


def _configure_root() -> None:
    global _configured
    if _configured:
        return
    _LOG_DIR.mkdir(exist_ok=True)
    root = logging.getLogger("genesis")
    root.setLevel(logging.INFO)
    root.propagate = False

    file_handler = RotatingFileHandler(
        _LOG_DIR / "genesis.log", maxBytes=5_000_000, backupCount=5, encoding="utf-8"
    )
    file_handler.setFormatter(logging.Formatter(_FMT))
    console = logging.StreamHandler()
    console.setFormatter(logging.Formatter(_FMT))

    root.addHandler(file_handler)
    root.addHandler(console)
    _configured = True


def get_logger(name: str) -> logging.Logger:
    """取一个挂在 genesis 命名空间下的 logger(首次调用时初始化落盘)。"""
    _configure_root()
    return logging.getLogger(f"genesis.{name}")
