/**
 * P1-7 smoke test — email notifications are gated by DedupService.
 *
 * Run: npx tsx scripts/smoke/p1-7-email-dedup.ts
 */
import './_lib';
import { ok, fail } from './_lib';

// Stub Prisma + Email service + dedup before importing the dispatcher.
const prismaMod = require('../../src/lib/prisma') as { prisma: Record<string, unknown> };
prismaMod.prisma.notificationRule = { findMany: async () => [] } as unknown;
prismaMod.prisma.notificationChannel = { findMany: async () => [] } as unknown;
prismaMod.prisma.alertPreference = { findMany: async () => [] } as unknown;
prismaMod.prisma.user = { findMany: async () => [] } as unknown;
prismaMod.prisma.userNotification = { createMany: async () => ({ count: 0 }) } as unknown;

let emailCalls = 0;
const emailMod = require('../../src/lib/services/email.service') as { EmailService: Record<string, unknown> };
emailMod.EmailService.emit = async () => { emailCalls++; };
emailMod.EmailService.getRecipients = async () => [];

let dedupAnswer = true;
const dedupMod = require('../../src/lib/notification-system/dedup/dedup.service') as { DedupService: Record<string, unknown> };
dedupMod.DedupService.default = () => ({ shouldDeliver: async () => dedupAnswer });

const outboxMod = require('../../src/lib/notification-system/outbox/outbox.service') as { OutboxService: Record<string, unknown> };
outboxMod.OutboxService.default = () => ({ enqueue: async () => undefined });

// Fresh import of dispatcher AFTER patches.
delete require.cache[require.resolve('../../src/lib/notification-system')];
const { NotificationDispatcher } = require('../../src/lib/notification-system') as typeof import('../../src/lib/notification-system');

async function main(): Promise<void> {
    dedupAnswer = true;
    emailCalls = 0;
    await NotificationDispatcher.emit('monitor_down', {
        monitorId: 1,
        monitorName: 'm',
        monitorRegion: 'KE',
        details: 'down',
    });
    if (emailCalls !== 1) fail('P1-7 dedup-true', `expected 1 email send, got ${emailCalls}`);
    ok('dedup=true → email emit called');

    dedupAnswer = false;
    emailCalls = 0;
    await NotificationDispatcher.emit('monitor_down', {
        monitorId: 1,
        monitorName: 'm',
        monitorRegion: 'KE',
        details: 'down',
    });
    if (emailCalls !== 0) fail('P1-7 dedup-false', `expected 0 email sends, got ${emailCalls}`);
    ok('dedup=false → email suppressed');

    ok('P1-7 email-dedup', 'email path now gated by DedupService');
}

main().catch((err) => fail('P1-7 email-dedup', String(err)));
