import { getCurrentUser } from '@/lib/auth';
import { subscribeInbox } from '@/lib/bus';

export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';

// Server-Sent Events stream: pushes a "ping" whenever the current user's inbox changes.
export async function GET(req: Request) {
  const user = await getCurrentUser();
  if (!user) return new Response('unauthorized', { status: 401 });

  const encoder = new TextEncoder();
  let heartbeat: ReturnType<typeof setInterval>;
  let unsubscribe: () => void = () => {};

  const stream = new ReadableStream({
    start(controller) {
      const send = (event: string) => {
        try {
          controller.enqueue(encoder.encode(`data: ${event}\n\n`));
        } catch {
          /* stream already closed */
        }
      };
      send('connected');
      unsubscribe = subscribeInbox(user.id, () => send('inbox'));
      heartbeat = setInterval(() => send('hb'), 25000);

      req.signal.addEventListener('abort', () => {
        clearInterval(heartbeat);
        unsubscribe();
        try {
          controller.close();
        } catch {
          /* already closed */
        }
      });
    },
    cancel() {
      clearInterval(heartbeat);
      unsubscribe();
    },
  });

  return new Response(stream, {
    headers: {
      'Content-Type': 'text/event-stream; charset=utf-8',
      'Cache-Control': 'no-cache, no-transform',
      Connection: 'keep-alive',
      'X-Accel-Buffering': 'no',
    },
  });
}
