"""Registry discovery + routing tests."""

from __future__ import annotations

import sys
from pathlib import Path

import pytest

_RECOIL = Path(__file__).resolve().parents[2]
if str(_RECOIL) not in sys.path:
    sys.path.insert(0, str(_RECOIL))


@pytest.fixture(autouse=True)
def _test_mode(monkeypatch):
    monkeypatch.setenv("RECOIL_PROVIDER_MODE", "test")
    monkeypatch.setenv("FAL_KEY", "x")
    monkeypatch.setenv("ATLAS_CLOUD_API_KEY", "x")
    monkeypatch.setenv("PIAPI_API_KEY", "x")
    monkeypatch.delenv("RECOIL_PROVIDER_OVERRIDE", raising=False)
    from recoil.execution.providers.registry import reset_caches_for_tests

    reset_caches_for_tests()
    yield
    reset_caches_for_tests()


def _ufv(**k):
    from recoil.execution.providers.base import UnifiedVideoPayload

    kwargs = dict(
        prompt="hello", duration_s=5, resolution="720p", model_id="seeddance-2.0"
    )
    kwargs.update(k)
    return UnifiedVideoPayload(**kwargs)


def test_registry_discovers_all_adapters():
    """Registry must auto-discover every declared adapter module.

    CP-2 Phase 2 (2026-04-26): renamed from
    `test_registry_discovers_all_three_adapters` and expanded to include
    `google` (added for nbp/flash/veo-3.1 per CP-2 Phase 2).
    CP-2 Phase 3 (2026-04-26): added `wan` (wan-2.7-i2v / wan-2.7-r2v).
    CP-2 Phase 3b (2026-04-26): added `kling` (kling-o3 / kling-v3 / kling-v3-i2v).
    Added `flora` (Flora worksurface/execution target; ~30% cheaper than fal).
    2026-06-24: added `comfyui` (local Krea 2 Turbo image generation).
    Future adapters must be added here as they land.
    """
    from recoil.execution.providers.registry import list_adapters

    ids = sorted(a.provider_id for a in list_adapters())
    assert ids == ["atlas", "comfyui", "fal", "flora", "google", "kling", "piapi", "wan"]


def test_primary_routes_to_flora_for_t2v():
    # seeddance-2.0 primary is now `flora` (Flora per-second pricing decision;
    # provider_strategy.json has primary=flora / fallback=fal).
    from recoil.execution.providers.registry import resolve_adapter

    adapter, tier = resolve_adapter("seeddance-2.0", _ufv())
    assert adapter.provider_id == "flora"
    assert tier == "standard_720p"


def test_end_frame_exception_routes_to_fal(monkeypatch):
    from recoil.execution.providers.registry import resolve_adapter, reset_caches_for_tests

    monkeypatch.setattr(
        "recoil.execution.providers.registry.load_strategy",
        lambda force=False: {
            "seeddance-2.0": {
                "primary": "piapi",
                "primary_tier": "seedance-2",
                "capability_exceptions": {"end_frame": "fal"},
            }
        },
    )
    reset_caches_for_tests()
    adapter, tier = resolve_adapter(
        "seeddance-2.0", _ufv(image="http://x/a.jpg", image_tail="http://x/b.jpg")
    )
    assert adapter.provider_id == "fal"


def test_env_override_forces_atlas(monkeypatch):
    monkeypatch.setenv("RECOIL_PROVIDER_OVERRIDE", "atlas")
    from recoil.execution.providers.registry import reset_caches_for_tests, resolve_adapter

    reset_caches_for_tests()
    adapter, _ = resolve_adapter("seeddance-2.0", _ufv())
    assert adapter.provider_id == "atlas"


def test_fallback_routes_to_fal():
    # seeddance-2.0 now has a configured fallback (fal) behind the flora primary.
    from recoil.execution.providers.registry import resolve_fallback

    fb = resolve_fallback("seeddance-2.0", _ufv())
    assert fb is not None
    adapter, _tier = fb
    assert adapter.provider_id == "fal"


def test_unknown_model_raises():
    from recoil.execution.providers.registry import resolve_adapter

    with pytest.raises(ValueError):
        resolve_adapter("no-such-model", _ufv(model_id="no-such-model"))
