import { EventEmitter } from "events";

export type LogLevel = "info" | "success" | "warn" | "error" | "debug";

export interface ScraperLogEvent {
    ts: string;        // ISO timestamp
    level: LogLevel;
    portal?: string;   // nombre del portal/scraper
    msg: string;
}

export interface ScraperProgressEvent {
    portal: string;
    phase: "start" | "progress" | "done" | "error";
    total?: number;
    saved?: number;
    msg?: string;
}

class ScraperEventBus extends EventEmitter {
    private logs: ScraperLogEvent[] = [];
    private readonly MAX_LOGS = 500;

    log(level: LogLevel, msg: string, portal?: string) {
        const ev: ScraperLogEvent = {
            ts: new Date().toISOString(),
            level,
            portal,
            msg,
        };
        this.logs.push(ev);
        if (this.logs.length > this.MAX_LOGS) this.logs.shift();
        this.emit("log", ev);
    }

    progress(ev: ScraperProgressEvent) {
        this.emit("progress", ev);
    }

    /** Últimas N líneas del buffer */
    recent(n = 100): ScraperLogEvent[] {
        return this.logs.slice(-n);
    }

    clearLogs() {
        this.logs = [];
    }
}

// Singleton global
export const scraperBus = new ScraperEventBus();
scraperBus.setMaxListeners(50);

/** Helper: emitir log de un portal concreto */
export function busLog(level: LogLevel, msg: string, portal?: string) {
    scraperBus.log(level, msg, portal);
    // Redirigir también a console para que los logs de PM2 sigan funcionando
    const prefix = portal ? `[${portal}] ` : "";
    if (level === "error") console.error(prefix + msg);
    else if (level === "warn") console.warn(prefix + msg);
    else console.log(prefix + msg);
}
