/**
 * Theme D smoke — observability layer.
 *
 * Verifies:
 *   - The pino logger is wired and accepts the expected API surface
 *   - The Prometheus registry is constructed
 *   - The /metrics endpoint module loads without error
 *
 * Run: npx tsx scripts/smoke/d-observability.ts
 */
import './_lib';
import { ok, fail } from './_lib';
import { log } from '../../src/lib/observability/logger';
import { registry, probesTotal, probeDurationSeconds } from '../../src/lib/observability/metrics';

async function main(): Promise<void> {
    // 1. Logger surface
    if (typeof log.info !== 'function') fail('D.logger', 'log.info missing');
    if (typeof log.child !== 'function') fail('D.logger', 'log.child missing');
    const child = log.child({ component: 'smoke' });
    if (typeof child.info !== 'function') fail('D.logger', 'child().info missing');
    ok('logger exposes pino-shaped surface');

    // 2. Registry built + default metrics present
    const text = await registry.metrics();
    if (!text.includes('uptime_sentinel_')) {
        fail('D.metrics', 'registry has no uptime_sentinel_ metrics');
    }
    ok('registry produces Prometheus text');

    // 3. Custom counters/histograms registered
    probesTotal.labels('up', 'http').inc(1);
    const text2 = await registry.metrics();
    if (!text2.includes('uptime_sentinel_probes_total')) {
        fail('D.counter', 'probesTotal counter not registered');
    }
    ok('probesTotal counter emits to registry');

    // 4. Histogram timer round-trip
    const end = probeDurationSeconds.startTimer({ monitor_type: 'http' });
    // Tiny synchronous gap; doesn't matter for the assertion
    end();
    const text3 = await registry.metrics();
    if (!text3.includes('uptime_sentinel_probe_duration_seconds_bucket')) {
        fail('D.histogram', 'probeDurationSeconds histogram not registered');
    }
    ok('probeDurationSeconds histogram exports buckets');

    // 5. Process metrics included via collectDefaultMetrics
    if (!text3.includes('uptime_sentinel_process_')) {
        fail('D.defaults', 'collectDefaultMetrics did not register process_* metrics');
    }
    ok('Node process metrics included (uptime_sentinel_process_*)');

    ok('Theme D observability smoke', 'logger + metrics layer contracts pass');
}

main().catch((e) => {
    console.error(e);
    process.exit(1);
});
