// src/lib/reporting/xyReporter.ts
import { performance } from "node:perf_hooks";
var jsonMode = false;
var strictMode = false;
var originalStdoutWrite;
var envelopeEmitted = false;
var currentCommand = "unknown";
var startTime = 0;
function isJsonMode() {
  return jsonMode;
}
function setJsonMode(enabled) {
  if (jsonMode === enabled) return;
  jsonMode = enabled;
  if (enabled && !originalStdoutWrite) {
    originalStdoutWrite = process.stdout.write.bind(process.stdout);
    const stderrWrite = process.stderr.write.bind(process.stderr);
    process.stdout.write = stderrWrite;
    process.on("exit", emitFallbackEnvelope);
  }
}
function isStrictMode() {
  return strictMode || process.env.XY_STRICT === "1";
}
function setStrictMode(enabled) {
  strictMode = enabled;
  if (enabled) {
    process.env.XY_STRICT = "1";
  }
}
function setCurrentCommand(name) {
  currentCommand = name;
  startTime = performance.now();
  envelopeEmitted = false;
}
function emitJson(envelope) {
  if (envelopeEmitted) return;
  envelopeEmitted = true;
  const json = JSON.stringify(envelope) + "\n";
  if (originalStdoutWrite) {
    originalStdoutWrite(json);
  } else {
    process.stdout.write(json);
  }
}
function emitFallbackEnvelope() {
  if (envelopeEmitted) return;
  const raw = process.exitCode ?? 0;
  const code = typeof raw === "number" ? raw : Number(raw) || 0;
  emitJson({
    command: currentCommand,
    durationMs: Math.round(performance.now() - startTime),
    errorCount: code === 0 ? 0 : 1,
    exitCode: code,
    schemaVersion: 1,
    success: code === 0,
    warningCount: 0
  });
}
function xyLog(...args) {
  if (jsonMode) {
    process.stderr.write(args.map((arg) => typeof arg === "string" ? arg : String(arg)).join(" ") + "\n");
  } else {
    console.log(...args);
  }
}
function resetReporterForTesting() {
  if (originalStdoutWrite) {
    process.stdout.write = originalStdoutWrite;
    originalStdoutWrite = void 0;
  }
  jsonMode = false;
  envelopeEmitted = false;
  currentCommand = "unknown";
  startTime = 0;
}
export {
  emitJson,
  isJsonMode,
  isStrictMode,
  resetReporterForTesting,
  setCurrentCommand,
  setJsonMode,
  setStrictMode,
  xyLog
};
//# sourceMappingURL=xyReporter.mjs.map
