import logging
from config import Config
import os
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler

# 确保日志目录存在
def ensure_log_dir(log_dir):
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
    return log_dir

# 创建通用的日志格式化器
def create_formatter(format_str=None):
    if not format_str:
        format_str = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    return logging.Formatter(format_str)

# 创建服务器日志记录器
def setup_server_logger(log_dir=Config.LOG_DIR, max_bytes=getattr(Config, 'LOG_MAX_BYTES', 10*1024*1024), 
                       backup_count=getattr(Config, 'LOG_BACKUP_COUNT', 5), 
                       level=getattr(Config, 'LOG_LEVEL', logging.INFO), 
                       log_format=None):
    """
    创建服务器日志记录器
    
    Args:
        log_dir: 日志目录
        max_bytes: 单个日志文件最大大小
        backup_count: 保留的备份文件数量
        level: 日志级别
        log_format: 日志格式
    
    Returns:
        logging.Logger: 日志记录器
    """
    log_dir = ensure_log_dir(log_dir)
    logger = logging.getLogger('trade_server')
    logger.setLevel(level)
    
    # 清除已有的处理器
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)
    
    # 创建文件处理器
    file_handler = RotatingFileHandler(
        os.path.join(log_dir, 'trade_server.log'),
        maxBytes=max_bytes,
        backupCount=backup_count
    )
    formatter = create_formatter(log_format)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    return logger

# 创建真实交易日志记录器
def setup_real_trader_logger(log_dir=Config.LOG_DIR, 
                            max_bytes=getattr(Config, 'LOG_MAX_BYTES', 10*1024*1024), 
                            backup_count=getattr(Config, 'LOG_BACKUP_COUNT', 5), 
                            level=getattr(Config, 'LOG_LEVEL', logging.INFO), 
                            log_format=None):
    """
    创建真实交易日志记录器
    
    Args:
        log_dir: 日志目录
        max_bytes: 单个日志文件最大大小
        backup_count: 保留的备份文件数量
        level: 日志级别
        log_format: 日志格式
    
    Returns:
        logging.Logger: 日志记录器
    """
    log_dir = ensure_log_dir(log_dir)
    logger = logging.getLogger('real_trader')
    logger.setLevel(level)
    
    # 清除已有的处理器
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)
    
    # 创建基于大小的滚动文件处理器，替换原有的基于时间的处理器
    file_handler = RotatingFileHandler(
        os.path.join(log_dir, 'real_trader.log'),
        maxBytes=max_bytes,
        backupCount=backup_count
    )
    formatter = create_formatter(log_format or '%(asctime)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    return logger

# 创建模拟交易日志记录器
def setup_simulation_logger(log_dir=Config.LOG_DIR, 
                           max_bytes=getattr(Config, 'LOG_MAX_BYTES', 10*1024*1024), 
                           backup_count=getattr(Config, 'LOG_BACKUP_COUNT', 5), 
                           level=getattr(Config, 'LOG_LEVEL', logging.INFO), 
                           log_format=None):
    """
    创建模拟交易日志记录器
    
    Args:
        log_dir: 日志目录
        max_bytes: 单个日志文件最大大小
        backup_count: 保留的备份文件数量
        level: 日志级别
        log_format: 日志格式
    
    Returns:
        logging.Logger: 日志记录器
    """
    log_dir = ensure_log_dir(log_dir)
    logger = logging.getLogger('simulation_trader')
    logger.setLevel(level)
    
    # 清除已有的处理器
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)
    
    # 创建文件处理器
    file_handler = RotatingFileHandler(
        os.path.join(log_dir, 'simulation_trader.log'),
        maxBytes=max_bytes,
        backupCount=backup_count
    )
    formatter = create_formatter(log_format or '%(asctime)s - %(message)s')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    return logger

# 创建策略持仓管理日志记录器 (使用与服务器相同的日志记录器)
def setup_strategy_logger():
    """
    创建策略持仓管理日志记录器
    
    Returns:
        logging.Logger: 日志记录器
    """
    return logging.getLogger('trade_server')

# 根据配置创建合适的日志记录器
def get_logger(module_name, 
              log_dir=Config.LOG_DIR, 
              level=getattr(Config, 'LOG_LEVEL', logging.INFO)):
    """
    获取适合模块的日志记录器
    
    Args:
        module_name: 模块名称，如 'server', 'real_trader', 'simulation_trader', 'strategy'
        log_dir: 日志目录
        level: 日志级别
    
    Returns:
        logging.Logger: 日志记录器
    """
    if module_name == 'server':
        return setup_server_logger(log_dir, level=level)
    elif module_name == 'real_trader':
        return setup_real_trader_logger(log_dir, level=level)
    elif module_name == 'simulation_trader':
        return setup_simulation_logger(log_dir, level=level)
    elif module_name == 'strategy':
        return setup_strategy_logger()
    else:
        # 默认日志记录器
        logger = logging.getLogger(module_name)
        logger.setLevel(level)
        
        # 确保日志记录器至少有一个处理器
        if not logger.handlers:
            log_dir = ensure_log_dir(log_dir)
            handler = logging.StreamHandler()
            handler.setFormatter(create_formatter())
            logger.addHandler(handler)
            
            # 添加文件处理器
            file_handler = RotatingFileHandler(
                os.path.join(log_dir, f'{module_name}.log'),
                maxBytes=getattr(Config, 'LOG_MAX_BYTES', 10*1024*1024),
                backupCount=getattr(Config, 'LOG_BACKUP_COUNT', 5)
            )
            file_handler.setFormatter(create_formatter())
            logger.addHandler(file_handler)
        
        return logger 