/**
* 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 };
}