/**
 * fixtures 版の「アラートの対応状況の上書き表」（指示書AT 段階4-3）。
 *
 * `PATCH /prechecks/{id}/status` を `USE_FIXTURES=true` でも動かすため、
 * ★`lib/fixtures/prechecks.ts` は書き換えず★、モジュール内に id → 4項目の上書きを持つ。
 * `fixtureSource.prechecks()` と `fixtureSource.precheckItemById()` は上書きを反映して返す。
 *
 * ★プロセスを再起動すると消える★（それで良い。fixtures は開発・デモ用。D-045）。
 * テストは `resetFixturePrecheckOverrides()` で毎回空に戻すこと。
 *
 * ★Prisma 版と同じ規則で書く★ — パッチは `robotErrorColumnsFromPatch()`（実行時の歯止め）を通し、
 * 4項目（`resolution_status` / `responded_at` / `resolved_at` / `note`）以外は上書きしない。
 */
import { robotErrorColumnsFromPatch } from "@/lib/db/robot-error-write";
import { toJstIso } from "@/lib/format/date";
import type { PrecheckItem, PrecheckStatusPatch } from "@/lib/types";

type PrecheckOverride = Pick<
  PrecheckItem,
  "resolution_status" | "responded_at" | "resolved_at" | "note"
>;

const overrides = new Map<string, PrecheckOverride>();

/** テスト用: 上書き表を空にする */
export function resetFixturePrecheckOverrides(): void {
  overrides.clear();
}

/** 1行に上書きを反映する（上書きが無ければそのまま。★元の配列の要素は書き換えない★） */
export function withFixturePrecheckOverride(row: PrecheckItem): PrecheckItem {
  const override = overrides.get(row.id);
  return override ? { ...row, ...override } : row;
}

/**
 * fixtures 版の書き込み。対象は ★`severity === "precheck"` の行だけ★（§3-3。Prisma 版と同じ判定）。
 * 該当が無ければ `matched: 0`。
 */
export function applyFixturePrecheckPatch(
  rows: readonly PrecheckItem[],
  id: string,
  patch: PrecheckStatusPatch
): { matched: number } {
  // ★Prisma 版と同じ歯止め★（4つ以外のキー・空パッチは例外）
  robotErrorColumnsFromPatch(patch);

  const base = rows.find((row) => row.id === id && row.severity === "precheck");
  if (!base) return { matched: 0 };

  const current = withFixturePrecheckOverride(base);
  const next: PrecheckOverride = {
    resolution_status: current.resolution_status,
    responded_at: current.responded_at,
    resolved_at: current.resolved_at,
    note: current.note,
  };
  if (patch.status !== undefined) next.resolution_status = patch.status;
  if (patch.note !== undefined) next.note = patch.note;
  // ★日時は「真の瞬間」→ API の ISO（+09:00）★（DB を経由しないので `toDbJst()` は通さない）
  if (patch.responded_at !== undefined) {
    next.responded_at = patch.responded_at === null ? null : toJstIso(patch.responded_at);
  }
  if (patch.resolved_at !== undefined) {
    next.resolved_at = patch.resolved_at === null ? null : toJstIso(patch.resolved_at);
  }
  overrides.set(id, next);
  return { matched: 1 };
}
