import chalk from 'chalk';

type LogLevel = 'debug' | 'info' | 'warn' | 'error';

interface LoggerOptions {
  level?: LogLevel;
  timestamp?: boolean;
}

/**
 * 彩色日志工具
 * @param options 日志配置
 */
class Logger {
  private level: LogLevel;
  private timestamp: boolean;

  constructor(options: LoggerOptions = {}) {
    this.level = options.level || process.env.REAI_VOLC_KL_LOG_LEVEL as LogLevel || 'debug';
    this.timestamp = options.timestamp !== false;
  }

  private getTimestamp(): string {
    return new Date().toISOString();
  }

  private formatMessage(level: LogLevel, ...messages: any[]): string {
    let coloredLevel: string;
    let formattedMessage = messages.map(msg => 
      typeof msg === 'object' ? JSON.stringify(msg) : msg
    ).join(' ');

    switch (level) {
      case 'debug':
        coloredLevel = chalk.green(level.toUpperCase());
        formattedMessage = chalk.green(formattedMessage);
        break;
      case 'info':
        coloredLevel = chalk.blue(level.toUpperCase());
        formattedMessage = chalk.blue(formattedMessage);
        break;
      case 'warn':
        coloredLevel = chalk.yellow(level.toUpperCase());
        formattedMessage = chalk.yellow(formattedMessage);
        break;
      case 'error':
        coloredLevel = chalk.red(level.toUpperCase());
        formattedMessage = chalk.red(formattedMessage);
        break;
    }

    const parts = [];
    if (this.timestamp) {
      parts.push(`[${this.getTimestamp()}]`);
    }
    parts.push(`[${coloredLevel}]`);
    parts.push(formattedMessage);

    return parts.join(' ');
  }

  /**
   * 打印调试日志
   * @param message 日志内容
   */
  debug(...messages: any[]): void {
    if (this.level === 'debug') {
      console.log(this.formatMessage('debug', ...messages));
    }
  }

  /**
   * 打印信息日志
   * @param message 日志内容
   */
  info(...messages: any[]): void {
    if (['debug', 'info'].includes(this.level)) {
      console.log(this.formatMessage('info', ...messages));
    }
  }

  /**
   * 打印警告日志
   * @param message 日志内容
   */
  warn(...messages: any[]): void {
    if (['debug', 'info', 'warn'].includes(this.level)) {
      console.warn(this.formatMessage('warn', ...messages));
    }
  }

  /**
   * 打印错误日志
   * @param message 日志内容
   */
  error(...messages: any[]): void {
    console.error(this.formatMessage('error', ...messages));
  }
}

export const logger = new Logger();