import { EventEmitter } from "events";

export type RealtimeEventType =
  | "ATTENDANCE_TAP_IN"
  | "ATTENDANCE_MUTATION"
  | "MACHINE_SYNC_EXECUTED"
  | "GRADES_SUBMITTED"
  | "MEMBER_IMPORTED"
  | "STUDENT_MUTATION"
  | "TEACHER_MUTATION"
  | "KESISWAAN_MUTATION"
  | "SYSTEM_HEARTBEAT";

export interface RealtimeEvent<T = any> {
  id: string;
  type: RealtimeEventType;
  payload: T;
  timestamp: number;
}

// Global EventEmitter singleton across Node.js runtime / HMR in Next.js
declare global {
  // eslint-disable-next-line no-var
  var __bpi_realtime_emitter: EventEmitter | undefined;
}

const realtimeEmitter: EventEmitter =
  global.__bpi_realtime_emitter || new EventEmitter();

if (process.env.NODE_ENV !== "production") {
  global.__bpi_realtime_emitter = realtimeEmitter;
}

// Max listeners safely set for SSE clients
realtimeEmitter.setMaxListeners(100);

export function broadcastRealtimeEvent<T = any>(
  type: RealtimeEventType,
  payload: T
): RealtimeEvent<T> {
  const event: RealtimeEvent<T> = {
    id: `evt-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,
    type,
    payload,
    timestamp: Date.now(),
  };

  try {
    realtimeEmitter.emit("realtime_event", event);
  } catch (err) {
    console.error("[Realtime Emitter Error]:", err);
  }

  return event;
}

export function subscribeRealtimeEvents(
  listener: (event: RealtimeEvent) => void
): () => void {
  realtimeEmitter.on("realtime_event", listener);
  return () => {
    realtimeEmitter.off("realtime_event", listener);
  };
}
