/**
 * Foliko Logger - 统一日志系统
 * 支持日志级别、命名空间、格式化输出
 */

const LOG_LEVELS = {
  DEBUG: 0,
  INFO: 1,
  WARN: 2,
  ERROR: 3,
  NONE: 4,
};

const LEVEL_NAMES = ['DEBUG', 'INFO', 'WARN', 'ERROR'];

class Logger {
  /**
   * @param {Object} options
   * @param {string} options.namespace - 日志命名空间
   * @param {number} options.level - 日志级别 (0-4)
   * @param {boolean} options.enableTimestamp - 是否显示时间戳
   * @param {boolean} options.enableColors - 是否使用颜色
   */
  constructor(options = {}) {
    this.namespace = options.namespace || 'app';
    this.level = options.level ?? LOG_LEVELS.INFO;
    this.enableTimestamp = options.enableTimestamp !== false;
    this.enableColors = options.enableColors !== false;

    // 颜色代码
    this.colors = {
      debug: '\x1b[36m', // 青色
      info: '\x1b[32m', // 绿色
      warn: '\x1b[33m', // 黄色
      error: '\x1b[31m', // 红色
      reset: '\x1b[0m',
      dim: '\x1b[2m', // 灰色
    };
  }

  /**
   * 创建子日志器
   * @param {string} namespace
   * @returns {Logger}
   */
  child(namespace) {
    return new Logger({
      namespace: `${this.namespace}:${namespace}`,
      level: this.level,
      enableTimestamp: this.enableTimestamp,
      enableColors: this.enableColors,
    });
  }

  /**
   * 设置日志级别
   * @param {string|number} level
   */
  setLevel(level) {
    if (typeof level === 'string') {
      this.level = LOG_LEVELS[level.toUpperCase()] ?? LOG_LEVELS.INFO;
    } else {
      this.level = level;
    }
  }

  /**
   * 格式化日志消息
   * @private
   */
  _format(level, levelName, args) {
    const color = this.colors[levelName.toLowerCase()] || '';
    const reset = this.colors.reset;
    const dim = this.colors.dim;

    const parts = [];

    // 命名空间
    parts.push(`${dim}[${this.namespace}]${reset}`);

    // 时间戳
    if (this.enableTimestamp) {
      const timestamp = new Date().toISOString().split('T')[1].slice(0, -1);
      parts.push(`${dim}${timestamp}${reset}`);
    }

    // 级别
    if (this.enableColors) {
      parts.push(`${color}${levelName.padEnd(5)}${reset}`);
    } else {
      parts.push(levelName.padEnd(5));
    }

    // 消息
    const message = args
      .map((arg) => {
        if (arg instanceof Error) {
          return `${arg.message}\n${arg.stack}`;
        }
        if (typeof arg === 'object') {
          try {
            return JSON.stringify(arg, null, 2);
          } catch {
            return String(arg);
          }
        }
        return String(arg);
      })
      .join(' ');

    parts.push(message);
    return parts.join(' ');
  }

  /**
   * 调试日志
   * @param {...any} args
   */
  debug(...args) {
    if (this.level <= LOG_LEVELS.DEBUG) {
      console.debug(this._format('debug', 'DEBUG', args));
    }
  }

  /**
   * 信息日志
   * @param {...any} args
   */
  info(...args) {
    if (this.level <= LOG_LEVELS.INFO) {
      console.log(this._format('info', 'INFO', args));
    }
  }

  /**
   * 警告日志
   * @param {...any} args
   */
  warn(...args) {
    if (this.level <= LOG_LEVELS.WARN) {
      console.warn(this._format('warn', 'WARN', args));
    }
  }

  /**
   * 错误日志
   * @param {...any} args
   */
  error(...args) {
    if (this.level <= LOG_LEVELS.ERROR) {
      console.error(this._format('error', 'ERROR', args));
    }
  }

  /**
   * 性能计时开始
   * @param {string} label
   * @returns {function} 结束计时函数
   */
  timer(label) {
    const start = process.hrtime.bigint();
    return () => {
      const end = process.hrtime.bigint();
      const ms = Number(end - start) / 1_000_000;
      this.debug(`${label}: ${ms.toFixed(2)}ms`);
    };
  }
}

// 全局日志器实例
const globalLogger = new Logger({
  namespace: 'foliko',
  level: process.env.LOG_LEVEL ? LOG_LEVELS[process.env.LOG_LEVEL.toUpperCase()] : LOG_LEVELS.INFO,
});

// 导出
module.exports = {
  Logger,
  logger: globalLogger,
  LOG_LEVELS,
};
