/**
 * Sistema de logging profissional para Edge Functions (Deno)
 * ✅ NÃO polui HTTP stream
 * ✅ Estruturado para análise
 * ✅ Conditional logging (dev vs prod)
 */

const isDev = Deno.env.get('DENO_ENV') === 'development' || 
              Deno.env.get('NODE_ENV') === 'development';

interface LogContext {
  [key: string]: any;
}

interface LogEntry {
  timestamp: string;
  level: 'INFO' | 'ERROR' | 'WARN' | 'DEBUG';
  context: string;
  message: string;
  data?: LogContext;
  error?: string;
}

class ServerLogger {
  private context: string;

  constructor(context: string = 'Server') {
    this.context = context;
  }

  private createLogEntry(
    level: LogEntry['level'],
    message: string,
    data?: LogContext,
    error?: Error | unknown
  ): LogEntry {
    const entry: LogEntry = {
      timestamp: new Date().toISOString(),
      level,
      context: this.context,
      message,
    };

    if (data) {
      entry.data = data;
    }

    if (error) {
      entry.error = error instanceof Error ? error.message : String(error);
    }

    return entry;
  }

  private write(entry: LogEntry) {
    // ✅ CRÍTICO: Usar Deno.stderr para NÃO poluir HTTP response stream
    // HTTP response vai para stdout, logs vão para stderr
    const output = JSON.stringify(entry) + '\n';
    
    if (entry.level === 'ERROR') {
      Deno.stderr.writeSync(new TextEncoder().encode(output));
    } else if (isDev) {
      // Apenas logar níveis não-error em development
      Deno.stderr.writeSync(new TextEncoder().encode(output));
    }
  }

  info(message: string, data?: LogContext) {
    if (!isDev) return; // ✅ Não logar INFO em produção
    
    const entry = this.createLogEntry('INFO', message, data);
    this.write(entry);
  }

  error(message: string, error?: Error | unknown, data?: LogContext) {
    // ✅ Sempre logar erros, mesmo em produção
    const entry = this.createLogEntry('ERROR', message, data, error);
    this.write(entry);
  }

  warn(message: string, data?: LogContext) {
    if (!isDev) return;
    
    const entry = this.createLogEntry('WARN', message, data);
    this.write(entry);
  }

  debug(message: string, data?: LogContext) {
    if (!isDev) return;
    
    const entry = this.createLogEntry('DEBUG', message, data);
    this.write(entry);
  }
}

// Exportar factory function
export function createLogger(context: string): ServerLogger {
  return new ServerLogger(context);
}

// Exportar logger default
export const logger = new ServerLogger('Server');
