"""财务报销自动化工具包"""

import datetime
import io
import logging
import sys
from pathlib import Path

_LOG_FMT = "%(asctime)s [%(levelname)-5s] %(name)s: %(message)s"
_LOG_DATE_FMT = "%Y-%m-%d %H:%M:%S"
_LOG_DIR = Path(__file__).resolve().parent.parent / "logs"


def _get_log_file() -> Path:
    """返回当日日志文件路径，如 logs/2026-06-09.log"""
    _LOG_DIR.mkdir(parents=True, exist_ok=True)
    return _LOG_DIR / f"{datetime.date.today():%Y-%m-%d}.log"


def get_logger(name: str) -> logging.Logger:
    """获取带时间戳的日志记录器

    输出格式: 2026-05-24 12:34:56 [INFO ] extractor: 扫描目录: ...
    日志同时输出到终端和 logs/<日期>.log

    只在最顶层的 logger 上添加标准 handler（stream + file），
    子 logger 通过 propagate 将日志传递给父 logger 统一处理。
    这样 _SSELogHandler 只需挂在父 logger 上即可捕获所有子日志。
    """
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)

    # 检查是否有父 logger 已初始化标准 handler
    # 如果有，子 logger 不重复添加，靠 propagate 传递即可
    parent_name = name.rsplit(".", 1)[0] if "." in name else None
    parent_has_handlers = False
    if parent_name:
        parent = logging.getLogger(parent_name)
        parent_has_handlers = getattr(parent, "_standard_handlers_initialized", False)

    if not getattr(logger, "_standard_handlers_initialized", False) and not parent_has_handlers:
        formatter = logging.Formatter(_LOG_FMT, _LOG_DATE_FMT)

        # 只有没有已初始化的父 logger 时，才添加标准 handler
        # 终端输出
        utf8_stream = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
        stream_handler = logging.StreamHandler(utf8_stream)
        stream_handler.setFormatter(formatter)
        logger.addHandler(stream_handler)

        # 文件输出
        file_handler = logging.FileHandler(str(_get_log_file()), encoding="utf-8")
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)

        logger._standard_handlers_initialized = True  # type: ignore[attr-defined]

    return logger
