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];
}
