import { Logger } from '@nestjs/common';

export interface LogEntry {
  time: string;
  level: 'info' | 'warn' | 'error';
  message: string;
}

/**
 * 同步任务日志收集器
 * 同时输出到控制台和收集到内存，执行完后存入数据库
 * 支持 onLog 回调用于 SSE 实时推送
 */
export class SyncLogger {
  private entries: LogEntry[] = [];
  private readonly nestLogger: Logger;
  private readonly onLog?: (entry: LogEntry) => void;

  constructor(context: string, onLog?: (entry: LogEntry) => void) {
    this.nestLogger = new Logger(context);
    this.onLog = onLog;
  }

  log(message: string) {
    this.nestLogger.log(message);
    const entry: LogEntry = { time: new Date().toISOString(), level: 'info', message };
    this.entries.push(entry);
    this.onLog?.(entry);
  }

  warn(message: string) {
    this.nestLogger.warn(message);
    const entry: LogEntry = { time: new Date().toISOString(), level: 'warn', message };
    this.entries.push(entry);
    this.onLog?.(entry);
  }

  error(message: string) {
    this.nestLogger.error(message);
    const entry: LogEntry = { time: new Date().toISOString(), level: 'error', message };
    this.entries.push(entry);
    this.onLog?.(entry);
  }

  getEntries(): LogEntry[] {
    return this.entries;
  }

  /** 获取纯文本格式日志 */
  getText(): string {
    return this.entries
      .map(e => `[${e.time}] [${e.level.toUpperCase()}] ${e.message}`)
      .join('\n');
  }
}
