# pyright: reportCallIssue=none
# Mitsuba 3 は variant ベースの動的属性解決を行うため Pylance/Pyright が
# mi.* を object 型と推論し reportCallIssue を誤検知する（GUIDE_06 の方針）．
"""YAML センサ定義 → Mitsuba sensor dict 変換モジュール．"""

from __future__ import annotations

import mitsuba as mi

from sm_tias_lightsim.scene.schema import SensorConfig


def build_sensor_dict(sensor: SensorConfig, position_scale: float) -> dict:
    """SensorConfig を Mitsuba sensor dict に変換する．

    Args:
        sensor: SceneConfig.sensor．
        position_scale: 座標スケール係数（mm→m なら 0.001）．position/target にも適用．

    Returns:
        Mitsuba sensor dict（perspective）．
    """
    pos = [c * position_scale for c in sensor.position]
    target = [c * position_scale for c in sensor.target]
    # 方向ベクトルは無次元なのでスケール不要
    up = list(sensor.up)

    to_world = mi.ScalarTransform4f().look_at(origin=pos, target=target, up=up)

    return {
        "type": "perspective",
        "fov": sensor.fov_deg,
        "to_world": to_world,
        "film": {
            "type": "hdrfilm",
            "width": sensor.film.width,
            "height": sensor.film.height,
            "rfilter": {"type": sensor.film.rfilter},
        },
        # spp は render 時に渡すので置きの値
        "sampler": {"type": "independent", "sample_count": 1},
    }
