/**
 * PR-C.2 smoke — SSE listener cap is observable.
 *
 * Verifies:
 *   1. getMonitorUpdateListenerCount() reports the actual count
 *   2. getSseMaxListeners() honours SSE_MAX_LISTENERS env override
 *   3. The Prometheus gauges register and collect without errors
 *
 * Run: npx tsx scripts/smoke/prc-2-sse-listeners-metric.ts
 */
import './_lib';
import { ok, fail } from './_lib';

// Set cap before any import so the module-init constant picks it up.
process.env.SSE_MAX_LISTENERS = '42';

async function main(): Promise<void> {
    const events = await import('../../src/lib/server-events');
    const { serverEventBus, getMonitorUpdateListenerCount, getSseMaxListeners } = events;

    if (getSseMaxListeners() !== 42) {
        fail('PR-C.2 cap', `expected 42 (from env), got ${getSseMaxListeners()}`);
    }
    ok('SSE_MAX_LISTENERS env honoured');

    const beforeCount = getMonitorUpdateListenerCount();

    const handler = () => undefined;
    serverEventBus.on('monitor_update', handler);

    if (getMonitorUpdateListenerCount() !== beforeCount + 1) {
        fail('PR-C.2 count', `expected ${beforeCount + 1}, got ${getMonitorUpdateListenerCount()}`);
    }
    ok('listener count reflects new subscription');

    serverEventBus.off('monitor_update', handler);
    if (getMonitorUpdateListenerCount() !== beforeCount) {
        fail('PR-C.2 cleanup', `expected ${beforeCount}, got ${getMonitorUpdateListenerCount()}`);
    }
    ok('listener count drops on unsubscribe');

    // Prometheus gauges collect without throwing.
    const metrics = await import('../../src/lib/observability/metrics');
    const out = await metrics.registry.metrics();
    if (!out.includes('uptime_sentinel_sse_listeners_count')) {
        fail('PR-C.2 metric', 'expected uptime_sentinel_sse_listeners_count in /metrics output');
    }
    if (!out.includes('uptime_sentinel_sse_listeners_max')) {
        fail('PR-C.2 metric', 'expected uptime_sentinel_sse_listeners_max in /metrics output');
    }
    ok('Prometheus gauges register and serialize');

    ok('PR-C.2 sse-listeners-metric smoke', 'listener cap is now observable');
}

main().catch((e) => fail('PR-C.2 crashed', String(e)));
