import { NextResponse } from "next/server";
import { amiEvents, getAmiClient, isAmiConnected } from "@/lib/ami-manager";

export async function GET() {
  // Inicializa el cliente AMI si aún no lo está
  getAmiClient();

  let intervalId: ReturnType<typeof setInterval> | undefined;
  let closed = false;
  let onAmiEvent: (evt: Record<string, unknown>) => void = () => { /* placeholder */ };

  const stream = new ReadableStream({
    start(controller) {
      const encoder = new TextEncoder();

      const safeEnqueue = (payload: string) => {
        if (closed) return;
        try {
          controller.enqueue(encoder.encode(payload));
        } catch (e) {
          // El controlador se cerró; detenemos heartbeat y removemos listeners
          closed = true;
          if (intervalId) clearInterval(intervalId);
          amiEvents.removeListener("amiEvent", onAmiEvent);
          console.error("SSE stream cerrado; deteniendo heartbeat.", e);
        }
      };

      // Emitir estado inicial
      safeEnqueue(`event: ami-status\ndata: ${JSON.stringify({ connected: isAmiConnected() })}\n\n`);

      // Listener de eventos AMI
      onAmiEvent = (evt: Record<string, unknown>) => {
        safeEnqueue(`data: ${JSON.stringify(evt)}\n\n`);
      };
      amiEvents.on("amiEvent", onAmiEvent);

      // Heartbeat para mantener la conexión viva
      intervalId = setInterval(() => {
        safeEnqueue(`: heartbeat\n\n`);
      }, 20000);
    },
    cancel() {
      closed = true;
      if (intervalId) clearInterval(intervalId);
      amiEvents.removeListener("amiEvent", onAmiEvent);
      console.log("Cliente SSE desconectado (cancel).");
    },
  });

  return new NextResponse(stream, {
    headers: {
      "Content-Type": "text/event-stream",
      "Cache-Control": "no-cache",
      Connection: "keep-alive",
    },
  });
}