/**
 * fixtures 版の「エラー一覧の対応状況の上書き表」（指示書AW 段階3-3 / D14）。
 *
 * `PATCH /errors/{error_id}/status` を `USE_FIXTURES=true` でも動かすため、
 * ★`lib/fixtures/error-reports.ts` は書き換えず★、モジュール内に error_id → 4列の上書きを持つ。
 * `fixtureSource.errorReports()` と `fixtureSource.errorReportById()` は上書きを反映して返す。
 *
 * ★値は DB の列の形★（`RobotErrorColumnsData`）— パッチは `robotErrorColumnsFromPatch()`
 *   （`lib/db/robot-error-write.ts`。Prisma 版の `writeRobotErrorColumns()` と同じ関数）で DB の列に写してから重ねる。
 *   だから ★4つ以外のキー・空パッチは Prisma 版と同じく例外★になり、日時は ★`toDbJst()` 済みの壁時計値★
 *   （読み出しは `errorReportItemFromRow()` の `jstIsoFromDb()` で戻る）。★同じ列を2つの規則で書かない★。
 *
 * ★AT の `fixture-precheck-overrides.ts` とは状態を共有しない★（id が重ならないので食い違いは起きない。§11 Q8）。
 * ★プロセスを再起動すると消える★（それで良い。fixtures は開発・デモ用。D-045）。
 * テストは `resetFixtureErrorReportOverrides()` で毎回空に戻すこと。
 */
import { robotErrorColumnsFromPatch, type RobotErrorColumnsData } from "@/lib/db/robot-error-write";
import type { FixtureErrorReportRow } from "@/lib/fixtures/error-reports";
import type { PrecheckStatusPatch } from "@/lib/types";

const overrides = new Map<string, RobotErrorColumnsData>();

/** テスト用: 上書き表を空にする */
export function resetFixtureErrorReportOverrides(): void {
  overrides.clear();
}

/**
 * 上書きを反映した行（★元の配列の要素は書き換えない★。上書きが無ければそのまま）。
 * ★列ごとに、上書きのキーがあるときだけ差し替える★（`comment` の `null` は「備考を消した」なので差し替える）。
 */
export function withFixtureErrorReportOverride<T extends FixtureErrorReportRow>(row: T): T {
  const override = overrides.get(row.error_id);
  if (!override) return row;
  const next: T = { ...row };
  if (override.status !== undefined) next.status = override.status;
  if (override.comment !== undefined) next.comment = override.comment;
  if (override.responded_at !== undefined) next.responded_at = override.responded_at;
  if (override.resolved_at !== undefined) next.resolved_at = override.resolved_at;
  return next;
}

/**
 * fixtures 版の書き込み。`robotErrorColumnsFromPatch(patch)` で DB の列に写し、既存の上書きに重ねる。
 *
 * ★`error_id === id` の行が無ければ `matched: 0`★（★大小文字違いも 0★ — Prisma 版は書く前に
 *   `errorReportById()` の `===` で弾くので、ここも `===` で揃える。D-4）。
 * ★事前チェックの行かどうかを問わない★（`robot_error_reports` に行があれば書ける。D-160 項2 / D11）。
 */
export function applyFixtureErrorReportPatch(
  rows: readonly FixtureErrorReportRow[],
  id: string,
  patch: PrecheckStatusPatch
): { matched: number } {
  // ★Prisma 版と同じ歯止め★（4つ以外のキー・空パッチは例外。行の有無より先に確かめる）
  const data = robotErrorColumnsFromPatch(patch);
  if (!rows.some((row) => row.error_id === id)) return { matched: 0 };
  overrides.set(id, { ...overrides.get(id), ...data });
  return { matched: 1 };
}
