# python/core/logger.py
"""
统一日志模块 - 为 bgxiong 插件提供标准化日志功能
✅ 单例初始化 ✅ 动态等级 ✅ 文件轮转 ✅ 中文支持
"""

import os
import sys
import logging
from logging.handlers import RotatingFileHandler
from datetime import datetime
from typing import Optional
from config import get_data_cache_dir
from config import get_log_level   

DATA_CACHE_DIR = get_data_cache_dir()
# === 配置常量 ===
DEFAULT_LOG_LEVEL = get_log_level()  # 从 config.py 获取日志等级
LOG_DIR = os.path.join(DATA_CACHE_DIR, 'logs')
LOG_FILENAME = f'plugin_{datetime.now().strftime("%Y%m%d")}.log'
MAX_BYTES = 10 * 1024 * 1024  # 单个日志文件最大 10MB
BACKUP_COUNT = 5  # 保留的历史文件数

# === 内部状态（确保只初始化一次）===
_initialized = False
_root_logger = None


def _setup_root_logger(level: str = DEFAULT_LOG_LEVEL) -> logging.Logger:
    """
    内部函数：配置根日志器（只执行一次）
    """
    global _initialized, _root_logger
    
    if _initialized:
        return _root_logger
    
    # 确保日志目录存在
    os.makedirs(LOG_DIR, exist_ok=True)
    log_path = os.path.join(LOG_DIR, LOG_FILENAME)
    
    # 创建根 logger
    _root_logger = logging.getLogger('bgxiong')
    _root_logger.setLevel(getattr(logging, level, logging.INFO))
    _root_logger.propagate = False  # 避免向父 logger 传播
    
    # 清除可能存在的旧 handler（防止重复添加）
    if _root_logger.hasHandlers():
        _root_logger.handlers.clear()
    
    # === Handler 1: 文件输出（带轮转）===
    file_handler = RotatingFileHandler(
        filename=log_path,
        maxBytes=MAX_BYTES,
        backupCount=BACKUP_COUNT,
        encoding='utf-8',
        delay=True  # 延迟创建文件，避免空日志
    )
    file_handler.setLevel(logging.DEBUG)  # 文件记录更详细
    file_handler.setFormatter(logging.Formatter(
        '%(asctime)s [%(levelname)s] %(name)s:%(lineno)d: %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    ))
    _root_logger.addHandler(file_handler)
    
    # === Handler 2: 控制台输出（开发环境启用）===
    if os.getenv('NODE_ENV') == 'development' or '--debug' in sys.argv:
        console_handler = logging.StreamHandler(sys.stderr)
        console_handler.setLevel(logging.DEBUG)
        console_handler.setFormatter(logging.Formatter(
            '🐍 [%(levelname)s] %(name)s: %(message)s'
        ))
        _root_logger.addHandler(console_handler)
    
    _initialized = True
    _root_logger.info(f"🔧 日志系统初始化完成 | 等级: {level} | 文件: {log_path}")
    
    return _root_logger


def get_logger(name: str, level: Optional[str] = None) -> logging.Logger:
    """
    ✅ 工厂函数：获取模块专用 logger
    
    Args:
        name: 模块名称，建议使用 __name__ 或自定义标识
              例如: 'bgxiong.subtitle_reader', 'bgxiong.api_client'
        level: 可选，覆盖全局日志等级（仅对该 logger 生效）
    
    Returns:
        配置好的 logging.Logger 实例
    """
    # 确保根 logger 已初始化
    root = _setup_root_logger()
    
    # 创建/获取子 logger
    logger = logging.getLogger(f'bgxiong.{name}')
    
    # 可选：设置该 logger 的独立等级
    if level:
        logger.setLevel(getattr(logging, level.upper(), logging.INFO))
    
    # ⚠️ 重要：子 logger 不需要添加 handler，会继承 root 的配置
    # 只需确保 propagate=True（默认值）
    
    return logger


# === 便捷函数（可选）===
def set_global_log_level(level: str):
    """动态修改全局日志等级（运行时生效）"""
    if _initialized:
        _root_logger.setLevel(getattr(logging, level.upper(), logging.INFO))
        _root_logger.info(f"🔄 日志等级已更新: {level.upper()}")


def get_log_file_path() -> str:
    """获取当前日志文件的完整路径（用于前端轮询或用户反馈）"""
    return os.path.join(LOG_DIR, LOG_FILENAME)