import { createConsola } from 'consola';
import type { ConsolaInstance, LogLevel } from 'consola';
import { DEFAULT_LOG_LEVEL } from './defaults';

/**
 * 日志级别映射
 * 将字符串日志级别映射到数字级别
 */
const LOG_LEVELS: Record<string, LogLevel> = {
  'silent': 0,  // 不输出任何日志
  'fatal': 1,   // 只输出致命错误
  'error': 2,   // 输出错误信息
  'warn': 3,    // 输出警告和错误信息
  'info': 4,    // 输出重要信息、警告和错误（默认级别）
  'success': 4, // 与 info 同级
  'debug': 5,   // 输出调试信息和 info 级别以上的日志
  'trace': 6,   // 输出跟踪信息和 debug 级别以上的日志
  'verbose': 6  // 与 trace 同级
};

/**
 * 日志管理器配置接口
 * 定义创建日志管理器时可以设置的选项
 */
export interface LoggerOptions {
  prefix?: string;                // 日志前缀
  level?: LogLevel | string;      // 日志级别
  timestamps?: boolean;           // 是否显示时间戳
  mockFn?: (...args: any[]) => void; // 用于测试的模拟函数
}

/**
 * 创建一个日志管理器实例
 * @param options 日志管理器配置选项
 * @returns 配置好的 Consola 实例
 */
export function createLogger(options: LoggerOptions = {}): ConsolaInstance {
  // 从环境变量获取日志级别，使用默认值
  const envLogLevel = process.env.LOG_LEVEL || process.env.LANE_LOG_LEVEL || DEFAULT_LOG_LEVEL;

  // 确定最终日志级别
  let level: LogLevel = 4; // 默认为 info 级别

  if (typeof options.level === 'number') {
    // 如果直接提供了数字级别
    level = options.level;
  } else if (typeof options.level === 'string' && LOG_LEVELS[options.level.toLowerCase()] !== undefined) {
    // 如果提供了字符串级别并且它在映射中存在
    level = LOG_LEVELS[options.level.toLowerCase()];
  } else if (LOG_LEVELS[envLogLevel.toLowerCase()] !== undefined) {
    // 如果环境变量中的级别在映射中存在
    level = LOG_LEVELS[envLogLevel.toLowerCase()];
  }

  // 创建 consola 实例
  const logger = createConsola({
    level,
    formatOptions: {
      date: options.timestamps !== false, // 默认显示时间戳
      colors: true, // 启用颜色
    },
  });

  // 如果提供了前缀，创建一个带前缀的 logger
  if (options.prefix) {
    return logger.withTag(options.prefix);
  }

  return logger;
}

/**
 * 默认日志管理器实例
 * 使用 '泳道管理' 作为前缀
 */
export const logger = createLogger({ prefix: '泳道管理' });

/**
 * 导出日志级别常量
 * 可以用于设置日志级别
 */
export const LogLevels = LOG_LEVELS;
