// Standalone runner for auditor fixtures. Invoke:
//
//   bun run auditor/fixtures/cli.ts hybrid_38_40_45
//
// Prints human-readable per-layer breakdown + JSON result so the
// output can be captured by the dynamic check without re-running.

import { runHybridFixture, type FixtureResult } from "./hybrid_38_40_45.ts";

const fixtureArg = process.argv[2] ?? "hybrid_38_40_45";

let result: FixtureResult;
switch (fixtureArg) {
  case "hybrid_38_40_45":
    result = await runHybridFixture();
    break;
  default:
    console.error(`unknown fixture: ${fixtureArg}`);
    process.exit(2);
}

// Human-readable summary
console.error(""); // blank line to stderr so stdout JSON stays clean
console.error(`─── Fixture: ${result.fixture} ───`);
console.error(`  overall: ${result.overall.toUpperCase()}`);
console.error(`  shipped:     [${result.shipped_phases.join(", ") || "—"}]`);
console.error(`  placeholder: [${result.placeholder_phases.join(", ") || "—"}]`);
console.error("");
for (const l of result.layers) {
  const mark = l.ok ? "✓" : "✗";
  const phaseStr = `Phase ${l.phase}`.padEnd(11);
  console.error(`  ${mark} ${phaseStr} ${l.layer.padEnd(30)} ${String(l.latency_ms).padStart(6)}ms`);
  if (l.ok) {
    console.error(`      ${l.evidence.slice(0, 200)}`);
  } else {
    console.error(`      ERROR: ${l.error?.slice(0, 240) ?? "unknown"}`);
  }
}
console.error("");
for (const n of result.notes) console.error(`  note: ${n}`);
console.error("");

// Machine-readable output on stdout.
console.log(JSON.stringify(result, null, 2));

// Exit code reflects overall: 0 pass, 2 partial, 1 fail.
// Dynamic check reads this AND the JSON; partial-pass is treated
// as informative (some layers shipped), not blocking on its own.
process.exit(result.overall === "pass" ? 0 : result.overall === "partial_pass" ? 2 : 1);
