"""共通フィクスチャ．

全テストモジュールから利用可能な pytest フィクスチャを定義する．
"""

import numpy
import pytest


@pytest.fixture(scope="session", autouse=True)
def mitsuba_variant():
    """セッション全体で Mitsuba variant を 1 度だけ設定する．

    mi.ScalarTransform4f 等の Mitsuba 型はモジュールインポート後に
    set_variant を呼ぶまでアクセスできない．軽量テスト（build_*_dict 系）も
    to_world 生成で内部的に mi.ScalarTransform4f を使うため，
    セッション開始時に variant を設定しておく必要がある．

    testing.md: Mitsuba をモックしない方針に従い実ライブラリを使用する．
    """
    import mitsuba as mi

    # この環境では LLVM バックエンドが利用できないため scalar_rgb を使用する．
    # baker.py も scalar_rgb を要求しており，テスト全体で統一する．
    # llvm_ad_rgb が利用可能な環境では "llvm_ad_rgb" に変更すること．
    mi.set_variant("scalar_rgb")


@pytest.fixture
def uniform_luminance_100x100() -> numpy.ndarray:
    """全画素が 100.0 の (100, 100) 輝度配列."""
    return numpy.full((100, 100), 100.0, dtype=numpy.float64)


@pytest.fixture
def radial_gradient_luminance_100x100() -> numpy.ndarray:
    """中心が明るく周辺が暗い放射グラジェント輝度配列 (100, 100).

    正規化楕円距離 d を用いて 200 - 100 * d で合成する．
    中心 (d=0) で 200，周辺 (d=1) で 100 程度となる．
    """
    from sm_tias_lightsim.evaluation.zones import compute_normalized_distance_map

    d = compute_normalized_distance_map(100, 100)
    return (200.0 - 100.0 * d).astype(numpy.float64)


@pytest.fixture
def red_pixel() -> numpy.ndarray:
    """純赤 (255, 0, 0) の 1x1 uint8 RGB 画像."""
    return numpy.array([[[255, 0, 0]]], dtype=numpy.uint8)


@pytest.fixture
def green_pixel() -> numpy.ndarray:
    """純緑 (0, 255, 0) の 1x1 uint8 RGB 画像."""
    return numpy.array([[[0, 255, 0]]], dtype=numpy.uint8)


@pytest.fixture
def blue_pixel() -> numpy.ndarray:
    """純青 (0, 0, 255) の 1x1 uint8 RGB 画像."""
    return numpy.array([[[0, 0, 255]]], dtype=numpy.uint8)
