/**
 * Theme B smoke — errorClass classification end-to-end.
 *
 * Validates the contract layers without hitting the DB:
 *  - classifyError covers each branch
 *  - Strategy types expose errorClass on StrategyCheckResult
 *  - Rules engine accepts errorClass + errorClassIn predicates
 *
 * Run: npx tsx scripts/smoke/b-errorclass.ts
 */
import './_lib';
import { ok, fail } from './_lib';
import { classifyError } from '../../src/lib/monitor-strategies/classify-error';

function main(): void {
    // 1. Classifier covers each branch.
    if (classifyError({ statusCode: 503 }) !== 'HTTP_5XX') fail('B.classifier', '5xx');
    if (classifyError({ statusCode: 404 }) !== 'HTTP_4XX') fail('B.classifier', '4xx');
    if (classifyError({ keywordFailed: true }) !== 'KEYWORD_MISS') fail('B.classifier', 'keyword');
    ok('classifyError maps status codes + keyword failures');

    const dnsErr = new Error('ENOTFOUND nope') as Error & { code?: string };
    dnsErr.code = 'ENOTFOUND';
    if (classifyError({ error: dnsErr }) !== 'DNS_FAIL') fail('B.classifier', 'DNS_FAIL');
    ok('classifyError maps ENOTFOUND -> DNS_FAIL');

    const tcpErr = new Error('ECONNREFUSED') as Error & { code?: string };
    tcpErr.code = 'ECONNREFUSED';
    if (classifyError({ error: tcpErr }) !== 'TCP_REJECT') fail('B.classifier', 'TCP_REJECT');
    ok('classifyError maps ECONNREFUSED -> TCP_REJECT');

    const tlsErr = new Error('CERT_HAS_EXPIRED') as Error & { code?: string };
    tlsErr.code = 'CERT_HAS_EXPIRED';
    if (classifyError({ error: tlsErr }) !== 'TLS_INVALID') fail('B.classifier', 'TLS_INVALID');
    ok('classifyError maps CERT_HAS_EXPIRED -> TLS_INVALID');

    if (classifyError({ error: new Error('Timeout') }) !== 'TIMEOUT') fail('B.classifier', 'TIMEOUT');
    ok('classifyError maps "Timeout" message -> TIMEOUT');

    if (classifyError({}) !== 'UNKNOWN') fail('B.classifier', 'UNKNOWN');
    ok('classifyError defaults to UNKNOWN');

    // 2. Specificity: keyword > code > status.
    if (classifyError({ statusCode: 200, keywordFailed: true }) !== 'KEYWORD_MISS') {
        fail('B.precedence', 'keyword should win over status');
    }
    ok('precedence: keyword > status');

    ok('Theme B errorClass smoke', 'classifier branches + precedence pass');
}

main();
