import { ROBOT_STATUS_TONES } from "@/lib/config";
import { THEME_TOKENS, type ThemeName } from "@/lib/theme";
/**
* 事前チェックのロボット状態(`status_1h` / `status_30m` / `robot_status`)に対応する色を返す。
*
* マッピングは `lib/config/index.ts` の `ROBOT_STATUS_TONES`(設定値)を参照する
* (`CLAUDE.md` §7 の閾値ハードコード禁止と同じ趣旨)。
* ★設定値に無いキー(未知の値・空文字を含む)はすべてグレー(`c.txD`)にフォールバックする★。
* 生値方針(D-077)では実データで既知の日本語6値が来ない可能性が高く、
* その場合は例外もテスト失敗も出さずに全部グレーになる。これが現在の期待挙動であり、
* 実データ接続後に実際に出現する値を `ROBOT_STATUS_TONES` に追記して直す。
*
* ★`Object.hasOwn()` で自前プロパティかを先に確かめてから引くこと★。
* `ROBOT_STATUS_TONES` はプレーンなオブジェクトリテラルなので、
* `constructor` / `toString` / `__proto__` / `hasOwnProperty` / `valueOf` などの
* `Object.prototype` のメンバー名を `status` として渡すと、添字アクセスが
* ★`undefined` ではなくプロトタイプ側の値(関数やオブジェクト)を拾ってしまう★。
* その値は `THEME_TOKENS` のキーではないため後段で `undefined` に落ち、
* `Pill` が `background:undefined22` を出して★グレーにすらフォールバックしない★。
* (D-077 の生値方針では未知の値が来ることが仕様上の前提なので、
* 「未知=必ずグレー」を実装側で保証する。値の変換はしない。)
*/
export function statusColor(theme: ThemeName, status: string): string {
const c = THEME_TOKENS[theme];
if (!Object.hasOwn(ROBOT_STATUS_TONES, status)) return c.txD;
const tone = ROBOT_STATUS_TONES[status];
return tone === undefined ? c.txD : c[tone];
}