import type { DecisionScope } from "../../schema/src/decisions/scope.js";

import { parseContract, reportClientConfigSchema } from "./report-schema.js";

export type ReviewVerdict = "confirmed_defect" | "not_defect";

export type StagedDecisionView = {
  findingId: string;
  evidenceFingerprint: string;
  verdict: ReviewVerdict;
  scope: DecisionScope;
  reason?: string;
  decidedAt: string;
  promotion?: {
    status: "staged";
    requestPath: string;
    contractId: string;
    contractVersion: string;
    stagedAt: string;
  };
};

export type ReviewDraftView = {
  schemaVersion: "review-draft/v1";
  revision: number;
  decisions: StagedDecisionView[];
  notes: Record<string, string>;
  undoStacks: Record<string, Array<{ verdict?: ReviewVerdict; reason?: string }>>;
};

export type ReportClientConfig = {
  apiToken?: string;
};

declare global {
  interface Window {
    __INVARIANTUM_REPORT__?: ReportClientConfig;
  }
}

export function readReportClientConfig(): ReportClientConfig {
  return window.__INVARIANTUM_REPORT__ ?? {};
}

export async function resolveReportClientConfig(): Promise<ReportClientConfig> {
  const inline = readReportClientConfig();
  if (inline.apiToken !== undefined) {
    return inline;
  }
  try {
    const response = await fetch("/api/session");
    if (response.ok) {
      const parsed = parseContract(reportClientConfigSchema, await response.json(), "report session config");
      const payload: ReportClientConfig =
        parsed.apiToken === undefined ? {} : { apiToken: parsed.apiToken };
      window.__INVARIANTUM_REPORT__ = payload;
      return payload;
    }
  } catch {
    // Static report directories do not expose interactive review APIs.
  }
  return {};
}

export function reviewApiAvailable(config: ReportClientConfig = readReportClientConfig()): boolean {
  return config.apiToken !== undefined;
}
