import { EventEmitter } from "events";

export type JobEvent =
  | { type: "job:state"; jobId: string; state: string }
  | { type: "job:paid"; jobId: string; invoiceType: "eval" | "work" }
  | { type: "job:completed"; jobId: string; result: string }
  | { type: "job:failed"; jobId: string; reason: string };

export type SessionEvent =
  | { type: "session:state"; sessionId: string; state: string }
  | { type: "session:paid"; sessionId: string; amountSats: number }
  | { type: "session:balance"; sessionId: string; balanceSats: number };

export type BusEvent = JobEvent | SessionEvent;

class EventBus extends EventEmitter {
  emit(event: "bus", data: BusEvent): boolean;
  emit(event: string, ...args: unknown[]): boolean {
    return super.emit(event, ...args);
  }

  on(event: "bus", listener: (data: BusEvent) => void): this;
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  on(event: string, listener: (...args: any[]) => void): this {
    return super.on(event, listener);
  }

  publish(data: BusEvent): void {
    this.emit("bus", data);
  }
}

export const eventBus = new EventBus();
eventBus.setMaxListeners(256);
