/**
 * Logging utilities for Onebox
 */

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

class Logger {
  private debugMode = false;

  constructor() {
    this.debugMode = Deno.args.includes('--debug') || Deno.env.get('DEBUG') === 'true';
  }

  /**
   * Log a message with specified level
   */
  log(level: LogLevel, message: string, ...args: unknown[]): void {
    const timestamp = new Date().toISOString();
    const prefix = this.getPrefix(level);

    const formattedMessage = `${prefix} ${message}`;

    switch (level) {
      case 'error':
        console.error(formattedMessage, ...args);
        break;
      case 'warn':
        console.warn(formattedMessage, ...args);
        break;
      case 'debug':
        if (this.debugMode) {
          console.log(formattedMessage, ...args);
        }
        break;
      default:
        console.log(formattedMessage, ...args);
    }
  }

  /**
   * Info level logging
   */
  info(message: string, ...args: unknown[]): void {
    this.log('info', message, ...args);
  }

  /**
   * Success level logging
   */
  success(message: string, ...args: unknown[]): void {
    this.log('success', message, ...args);
  }

  /**
   * Warning level logging
   */
  warn(message: string, ...args: unknown[]): void {
    this.log('warn', message, ...args);
  }

  /**
   * Error level logging
   */
  error(message: string, ...args: unknown[]): void {
    this.log('error', message, ...args);
  }

  /**
   * Debug level logging (only when --debug flag is present)
   */
  debug(message: string, ...args: unknown[]): void {
    this.log('debug', message, ...args);
  }

  /**
   * Get colored prefix for log level
   */
  private getPrefix(level: LogLevel): string {
    const colors = {
      info: '\x1b[36m',    // Cyan
      success: '\x1b[32m', // Green
      warn: '\x1b[33m',    // Yellow
      error: '\x1b[31m',   // Red
      debug: '\x1b[90m',   // Gray
    };
    const reset = '\x1b[0m';

    const icons = {
      info: 'ℹ',
      success: '✓',
      warn: '⚠',
      error: '✖',
      debug: '⚙',
    };

    return `${colors[level]}${icons[level]}${reset}`;
  }

  /**
   * Print a table (simplified version)
   */
  table(headers: string[], rows: string[][]): void {
    // Calculate column widths
    const widths = headers.map((header, i) => {
      const maxContentWidth = Math.max(
        ...rows.map((row) => (row[i] || '').toString().length)
      );
      return Math.max(header.length, maxContentWidth);
    });

    // Print header
    const headerRow = headers.map((h, i) => h.padEnd(widths[i])).join('  ');
    console.log(headerRow);
    console.log(headers.map((_, i) => '-'.repeat(widths[i])).join('  '));

    // Print rows
    for (const row of rows) {
      const formattedRow = row.map((cell, i) => (cell || '').toString().padEnd(widths[i])).join('  ');
      console.log(formattedRow);
    }
  }
}

export const logger = new Logger();
