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