export interface ProbeVerdictInput {
  ok: boolean;
  offers: readonly unknown[];
  needsSolve?: boolean;
}

export interface HarnessVerdict {
  state: "idle" | "passed" | "needs-solve" | "failed";
  summary: string;
}

export function phaseFVerdict(
  openStores: readonly ProbeVerdictInput[],
  autodoc: readonly ProbeVerdictInput[],
  expectedOpenStores = 5,
): HarnessVerdict {
  const openRan = openStores.length > 0;
  const autodocRan = autodoc.length > 0;
  const openPassed =
    openStores.length === expectedOpenStores && openStores.every(isUsefulResult);
  const autodocPassed = autodoc.length === 2 && autodoc.every(isUsefulResult);

  if (autodoc.some((outcome) => outcome.needsSolve)) {
    return {
      state: "needs-solve",
      summary: openRan
        ? "Open-store proof complete; Autodoc needs an interactive solve."
        : "Autodoc needs an interactive solve.",
    };
  }
  if ((openRan && !openPassed) || (autodocRan && !autodocPassed)) {
    return { state: "failed", summary: "One or more spike checks failed. See the report below." };
  }
  if (openPassed && autodocPassed) {
    return { state: "passed", summary: "PASS: open stores and persistent WebView returned offers." };
  }
  if (openPassed) {
    return { state: "passed", summary: "PASS: all five open stores returned offers." };
  }
  if (autodocPassed) {
    return { state: "passed", summary: "PASS: Autodoc cold and warm probes returned offers." };
  }
  return { state: "idle", summary: "Ready." };
}

function isUsefulResult(outcome: ProbeVerdictInput): boolean {
  return outcome.ok && outcome.offers.length > 0;
}
