/**
* D-Sec のコード値変換(純粋関数のみ)。
*
* ★変換元・変換先はいずれも TeamWorks 第2回回答で確定済み(D-065 Q1-2。
* `docs/decisions.md:483-484`)★。ここでの実装は「その表をコードにする」だけであり、
* 判定ロジックではない。
*
* ★1箇所に閉じ込める理由★: `prismaSource.dsDevices()`(正変換。DB→API)と
* `scripts/seed-local-db.ts`(逆変換。fixtures→DB)の両方が同じ対応表を
* 必要とする。2箇所に同じ 0/1 の対応をハードコードすると、どちらかだけ直して
* 食い違う事故が起きうるため、ここ1箇所を正とする。
*
* ★一覧に出すかどうか(`controls.status` が 0/1 か)は `isListedControlStatus()`★(指示書BB A1・D-182)—
* 0/1 以外の制御盤は一覧に出さない(例外にしない)。`connectionStatusFromControlStatus()` の例外は残し、呼ぶ前に外す。
*
* ★D-Sec アラートの対応状況(旧 `control_error_histories.status` の変換)はここに無い★ —
* D-Sec アラートは `robot_error_reports` から読み、変換は `resolutionStatusFromRobotErrorStatus()`
* (`lib/db/precheck-mapping.ts`)の1本(指示書AX D8・D14。D-180)。
*/
import type { DsConnectionStatus } from "@/lib/types";
/** ★一覧に出す制御盤の `controls.status` か(0/1)★(指示書BB A1・D-182)。0/1 以外は一覧に出さない(例外にしない) */
export function isListedControlStatus(status: number): boolean {
return status === 0 || status === 1;
}
/**
* `controls.status`(0/1) → `DsDevice.connection_status`(D-065 Q1-2)
* ★3状態目は存在しない(lib/types/index.ts の DsConnectionStatus 定義)★。
* 0/1 以外が来たら、静かに握りつぶさず例外を投げる。
*/
export function connectionStatusFromControlStatus(status: number): DsConnectionStatus {
if (status === 0) return "ok";
if (status === 1) return "error";
throw new Error(
`[ds-status] controls.status に想定外の値です: ${status}(0=正常/1=異常のみ想定。D-065 Q1-2)`
);
}
/** `DsDevice.connection_status` → `controls.status`(seed 用の逆変換) */
export function controlStatusFromConnectionStatus(status: DsConnectionStatus): number {
return status === "ok" ? 0 : 1;
}