"""キャリブレーション基準 ROI のプリセットと dict ベース抽出ヘルパ.

スライド／比較パネル生成スクリプト（scripts/build_*_panel.py 等）が共通で使う
ROI 座標を一元管理する．座標は評価パイプライン（sm-evaluate）の
configs/eval_baseline*.yaml / eval_real.yaml と同一．

評価本体（シーンスキーマ ``RoiConfig`` を使う側）は
``sm_tias_lightsim.evaluation.roi.extract_roi`` を使うこと．
本モジュールは ``{"x", "y", "w", "h"}`` dict を扱うスクリプト向けの軽量ヘルパ．
"""

from __future__ import annotations

import numpy as np

# シミュ luminance.npy 用 ROI（configs/eval_baseline*.yaml と整合）.
SIM_ROI = {"x": 24, "y": 37, "w": 464, "h": 450}

# 実機測定画像用 ROI（configs/eval_real.yaml と整合）.
REAL_ROI = {"x": 539, "y": 1015, "w": 1400, "h": 1409}


def extract_roi_xywh(arr: np.ndarray, roi: dict) -> np.ndarray:
    """ROI 矩形（``{"x", "y", "w", "h"}``）を切り出して float64 で返す.

    先頭 2 軸を (H, W) とみなすため，2D（輝度）・3D（RGB）どちらの配列も扱える．

    Args:
        arr: 先頭 2 軸が (H, W) の配列．
        roi: ``{"x", "y", "w", "h"}`` 形式の ROI 辞書（``SIM_ROI`` / ``REAL_ROI``）．

    Returns:
        ROI でクロップした float64 配列（入力と同じ次元数）．
    """
    x, y, w, h = roi["x"], roi["y"], roi["w"], roi["h"]
    return arr[y : y + h, x : x + w].astype(np.float64)
