// Minimal SSE manager: map userId -> set of controllers
class SSEManagerClass {
  private map = new Map<string, Set<any>>();

  add(userId: string, controller: any) {
    const set = this.map.get(userId) ?? new Set();
    set.add(controller);
    this.map.set(userId, set);
  }

  remove(userId: string, controller: any) {
    const set = this.map.get(userId);
    if (!set) return;
    set.delete(controller);
    if (set.size === 0) this.map.delete(userId);
  }

  send(userId: string, event: string, data: any) {
    const set = this.map.get(userId);
    if (!set) return;
    const payload = typeof data === "string" ? data : JSON.stringify(data);
    const s = `event: ${event}\ndata: ${payload}\n\n`;
    for (const c of set) {
      try {
        c.enqueue(s);
      } catch {}
    }
  }

  broadcast(event: string, data: any) {
    const payload = typeof data === "string" ? data : JSON.stringify(data);
    const s = `event: ${event}\ndata: ${payload}\n\n`;
    for (const set of this.map.values()) {
      for (const c of set) {
        try {
          c.enqueue(s);
        } catch {}
      }
    }
  }
}

export const SSEManager = new SSEManagerClass();

export default SSEManager;
