"""テスト全体で共有するフィクスチャ.

セグメンテーションのテスト（segmentation・evaluation・cli）で使うダミーの ONNX モデル
（`scripts/make_dummy_seg_models.py`．入出力の形だけを本物に合わせたもの）と，
合成データ生成スクリプト（`scripts/make_synthetic_segmentation.py`）の読み込み．
"""

from __future__ import annotations

import importlib.util
import sys
from pathlib import Path
from types import ModuleType

import pytest

SCRIPTS_DIR = Path(__file__).resolve().parents[1] / "scripts"


def load_script(name: str) -> ModuleType:
    """`scripts/<name>.py` をモジュールとして読み込む."""
    module_name = f"_test_script_{name}"
    if module_name in sys.modules:
        return sys.modules[module_name]
    spec = importlib.util.spec_from_file_location(module_name, SCRIPTS_DIR / f"{name}.py")
    assert spec is not None and spec.loader is not None
    module = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = module
    spec.loader.exec_module(module)
    return module


@pytest.fixture(scope="session")
def dummy_seg_models(tmp_path_factory: pytest.TempPathFactory) -> dict[str, Path]:
    """ダミーの ResUNet・検出モデルの ONNX を書き出し，そのパスを返す."""
    onnx = pytest.importorskip("onnx")
    script = load_script("make_dummy_seg_models")
    out = tmp_path_factory.mktemp("dummy_seg_models")
    onnx.save(script.build_resunet(), out / "ResUNet.onnx")
    onnx.save(script.build_detector(), out / "Detection_Normal.onnx")
    return {
        "root": out,
        "resunet": out / "ResUNet.onnx",
        "detector": out / "Detection_Normal.onnx",
    }


@pytest.fixture(scope="session")
def script_loader():
    """`scripts/<name>.py` を読み込む関数（`load_script`）を返す."""
    return load_script
