import { Router } from 'express';
import type { DatabaseSync } from 'node:sqlite';
import type { EventEmitter } from 'node:events';
import { requireAuth } from '../middleware/auth.ts';
import { listFeedIdsForUser } from '../db/repos/subscriptions.ts';
import { getFeedById } from '../db/repos/feeds.ts';
import type { BusEvents, EventPayload } from '../events.ts';

export function createStreamRouter(db: DatabaseSync, bus: EventEmitter<BusEvents>): Router {
  const router = Router();

  router.get('/', requireAuth, (req, res) => {
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    res.flushHeaders();

    const userId = req.session.userId!;
    const feedIds = new Set(listFeedIdsForUser(db, userId));

    const onItems = (event: EventPayload) => {
      if (!feedIds.has(event.feedId)) return;
      const feed = getFeedById(db, event.feedId);
      const payload = (event.items || []).map((r) => ({
        id: r.id,
        feedId: r.feed_id,
        feedTitle: feed ? feed.title : null,
        title: r.title,
        url: r.url,
        author: r.author,
        publishedAt: r.published_at,
        contentHtml: r.content_html,
        contentText: r.content_text,
        read: false,
      }));
      res.write(`event: items\ndata: ${JSON.stringify(payload)}\n\n`);
    };

    bus.on('items:new', onItems);
    const heartbeat = setInterval(() => res.write(': heartbeat\n\n'), 25000);

    req.on('close', () => {
      clearInterval(heartbeat);
      bus.off('items:new', onItems);
    });
  });

  return router;
}
