import os
import sys
import logging
from logging.handlers import RotatingFileHandler
from datetime import datetime

_loggers = {}


def get_logger(name='app'):
    """
    获取日志记录器
    
    Args:
        name: 日志名称（对应日志文件名）
    
    Returns:
        logging.Logger: 日志记录器
    """
    if name in _loggers:
        return _loggers[name]
    
    # 日志目录
    log_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'logs')
    os.makedirs(log_dir, exist_ok=True)
    
    # 日志文件路径
    log_file = os.path.join(log_dir, f'{name}.log')
    
    # 创建 logger
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    logger.propagate = False
    
    # 避免重复添加 handler
    if logger.handlers:
        _loggers[name] = logger
        return logger
    
    # 日志格式
    formatter = logging.Formatter(
        '%(asctime)s | %(levelname)-7s | %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    # 文件 handler（按大小轮转，最多 5 个备份，每个 10MB）
    file_handler = RotatingFileHandler(
        log_file,
        maxBytes=10 * 1024 * 1024,
        backupCount=5,
        encoding='utf-8'
    )
    file_handler.setLevel(logging.INFO)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    # 控制台 handler
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    _loggers[name] = logger
    return logger


def log_info(message, module='app'):
    """记录信息日志"""
    get_logger(module).info(message)


def log_error(message, module='app', exc_info=True):
    """记录错误日志
    
    Args:
        message: 错误信息
        module: 模块名
        exc_info: 是否包含异常堆栈（默认True，在except块中调用时自动打印堆栈）
    """
    logger = get_logger(module)
    logger.error(message)
    if exc_info:
        import traceback
        tb = traceback.format_exc()
        if 'NoneType: None' not in tb:
            logger.error(tb)


def log_warning(message, module='app'):
    """记录警告日志"""
    get_logger(module).warning(message)


def log_debug(message, module='app'):
    """记录调试日志"""
    get_logger(module).debug(message)
