/**
 * AUDIT-2 #13 smoke — maintenance-window lookup uses an in-process
 * cache with explicit invalidation on mutation.
 *
 * Background (followups §13): monitor-engine.ts:65 ran
 * prisma.maintenanceWindow.findMany on every monitor check. For 500
 * monitors at 60 s interval that's 500 queries/min over WAN — usually
 * for an empty table.
 *
 * Fix: 10 s TTL cache in maintenance-window.ts. Mutation routes
 * (POST/DELETE) call invalidateMaintenanceWindowsCache so operators
 * never see stale data after editing.
 *
 * This smoke statically asserts:
 *   1. getActiveMaintenanceWindowsCached + invalidate exported.
 *   2. monitor-engine.ts calls the cached helper (not direct findMany).
 *   3. maintenance-windows mutation routes invalidate after writes.
 */
import './_lib';
import { ok, fail } from './_lib';
import { readFileSync } from 'fs';
import path from 'path';

const ROOT = path.resolve(__dirname, '../..');

function read(rel: string): string {
    try { return readFileSync(path.join(ROOT, rel), 'utf8'); }
    catch (err) { fail(`read ${rel}`, String(err)); }
}

function assertPresent(label: string, src: string, needle: string | RegExp): void {
    const re = typeof needle === 'string'
        ? new RegExp(needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
        : needle;
    if (!re.test(src)) fail(label, `missing required pattern: ${String(needle)}`);
    ok(label);
}

function assertNotPresent(label: string, src: string, needle: string | RegExp): void {
    const re = typeof needle === 'string'
        ? new RegExp(needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
        : needle;
    if (re.test(src)) fail(label, `pattern still present: ${String(needle)}`);
    ok(label);
}

function main(): void {
    const service = read('src/lib/services/maintenance-window.ts');
    assertPresent('audit2-13: getActiveMaintenanceWindowsCached exported', service, /export async function getActiveMaintenanceWindowsCached/);
    assertPresent('audit2-13: invalidateMaintenanceWindowsCache exported', service, /export function invalidateMaintenanceWindowsCache/);
    assertPresent('audit2-13: TTL constant defined', service, /CACHE_TTL_MS\s*=\s*\d+/);

    const engine = read('src/lib/monitor-engine.ts');
    assertPresent(
        'audit2-13: monitor-engine uses cached helper',
        engine,
        /getActiveMaintenanceWindowsCached/,
    );
    assertNotPresent(
        'audit2-13: monitor-engine no longer calls prisma.maintenanceWindow.findMany directly',
        engine,
        /prisma\.maintenanceWindow\.findMany\(/,
    );

    const mwRoute = read('src/app/api/maintenance-windows/route.ts');
    assertPresent('audit2-13: route imports invalidateMaintenanceWindowsCache', mwRoute, /invalidateMaintenanceWindowsCache/);

    ok('audit2-16-maintenance-cache', 'maintenance-window lookup cached with 10s TTL + invalidation on mutation');
}

main();
