/**
 * PR-37 / EA-6 smoke — alert-fatigue control via consecutive-failure threshold.
 *
 * The reviewer's claim "one blip = immediate page" was FACTUALLY WRONG:
 * the engine already gates emits through `requiredDowns = monitor.retries`
 * via a hysteresis evaluator (src/lib/monitor-state.ts). What was wrong:
 *   - default was 3, the reviewer recommended 2
 *   - the field had no UI input
 *   - no smoke guarded the existing mechanism against regression
 *
 * PR-37:
 *   - Lowers the schema default from 3 to 2
 *   - Exposes `retries` as a numeric input in AddMonitorModal labelled
 *     "Consecutive failures before alerting"
 *   - Zod validates the input (1..10)
 *   - MonitorService writes the field on create + update
 *
 * This smoke asserts each layer stays in place against future
 * refactors AND guards the engine's existing hysteresis behavior.
 */
import './_lib';
import { ok, fail } from './_lib';
import { readFileSync, existsSync } from 'fs';
import path from 'path';

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

function read(label: string, rel: string): string {
    const abs = path.join(ROOT, rel);
    if (!existsSync(abs)) fail(`ea-6: ${label} missing`, abs);
    return readFileSync(abs, 'utf8');
}

function main(): void {
    const schema = read('schema.prisma', 'prisma/schema.prisma');
    const migration = read('EA-6 migration', 'prisma/legacy-manual-sql/ea-6-monitor-retries-default.sql');
    const engine = read('monitor-engine.ts', 'src/lib/monitor-engine.ts');
    const validations = read('monitor.schema.ts', 'src/lib/validations/monitor.schema.ts');
    const service = read('monitor.service.ts', 'src/lib/services/monitor.service.ts');
    const modal = read('AddMonitorModal.tsx', 'src/components/monitors/AddMonitorModal.tsx');

    // 1. Schema default is 2 (not 3)
    if (!/retries\s+Int\s+@default\(2\)/.test(schema)) {
        fail('ea-6: schema retries default is not 2', 'should be @default(2)');
    }
    ok('ea-6: Monitor.retries default is 2');

    // 2. Migration changes the column default
    if (!/ALTER COLUMN `retries` SET DEFAULT 2/.test(migration)) {
        fail('ea-6: migration does not change retries default to 2', 'migration shape wrong');
    }
    ok('ea-6: migration lowers default to 2');

    // 3. Engine reads requiredDowns = monitor.retries (existing
    //    mechanism — this is a REGRESSION guard, not new behavior)
    if (!/requiredDowns\s*=\s*monitor\.retries/.test(engine)) {
        fail('ea-6: engine no longer reads requiredDowns from monitor.retries', 'regression — hysteresis broken');
    }
    if (!/evaluateConfirmedState/.test(engine)) {
        fail('ea-6: engine no longer delegates to evaluateConfirmedState', 'regression — hysteresis broken');
    }
    ok('ea-6: engine still reads requiredDowns from monitor.retries + delegates to evaluateConfirmedState');

    // 4. Engine only emits monitor.down on confirmed state change
    if (!/if\s*\(\s*newConfirmedState\s*===\s*['"]down['"]\s*\)/.test(engine)) {
        fail('ea-6: engine does not gate monitor.down emit on confirmed state change', 'regression — single blip will page');
    }
    ok('ea-6: engine emits monitor.down ONLY on confirmed state change');

    // 5. Zod schema accepts + validates retries
    if (!/retries\s*:/.test(validations)) {
        fail('ea-6: validation schema does not accept retries', 'API will strip the field');
    }
    if (!/min\(1\)/.test(validations) || !/max\(10\)/.test(validations)) {
        fail('ea-6: validation does not clamp retries to 1..10', 'pathological values allowed');
    }
    ok('ea-6: validation accepts retries clamped 1..10');

    // 6. Service writes retries on create + update
    const createMatches = service.match(/prisma\.monitor\.create\(\{[\s\S]*?\}\)/g);
    if (!createMatches?.[0] || !/retries\s*:/.test(createMatches[0])) {
        fail('ea-6: MonitorService.createMonitor does not write retries', 'field unreachable');
    }
    if (!/retries\s*:\s*retries\s*===\s*undefined/.test(service)) {
        fail('ea-6: MonitorService.updateMonitor does not handle retries update properly', 'partial-update broken');
    }
    ok('ea-6: MonitorService writes retries on create + update');

    // 7. UI has the input
    if (!/Consecutive failures before alerting/.test(modal)) {
        fail('ea-6: AddMonitorModal missing the retries input', 'no way to configure per-monitor');
    }
    if (!/value=\{formData\.retries\}/.test(modal)) {
        fail('ea-6: AddMonitorModal retries input not wired to formData', 'input is decorative');
    }
    ok('ea-6: AddMonitorModal exposes retries as numeric input');

    ok('PR-37 consecutive-failure threshold', 'default 2, configurable, engine hysteresis preserved');
}

main();
