"""Tests for agent/video_gen_registry.py — provider registration & active lookup."""

from __future__ import annotations

import pytest

from agent import video_gen_registry
from agent.video_gen_provider import VideoGenProvider


class _FakeProvider(VideoGenProvider):
    def __init__(self, name: str, available: bool = True):
        self._name = name
        self._available = available

    @property
    def name(self) -> str:
        return self._name

    def is_available(self) -> bool:
        return self._available

    def generate(self, prompt, **kw):
        return {"success": True, "video": f"{self._name}://{prompt}"}


@pytest.fixture(autouse=True)
def _reset_registry():
    video_gen_registry._reset_for_tests()
    yield
    video_gen_registry._reset_for_tests()


class TestRegisterProvider:


    def test_rejects_empty_name(self):
        class Empty(VideoGenProvider):
            @property
            def name(self) -> str:
                return ""

            def generate(self, prompt, **kw):
                return {}

        with pytest.raises(ValueError):
            video_gen_registry.register_provider(Empty())


    def test_list_is_sorted(self):
        video_gen_registry.register_provider(_FakeProvider("zeta"))
        video_gen_registry.register_provider(_FakeProvider("alpha"))
        names = [p.name for p in video_gen_registry.list_providers()]
        assert names == ["alpha", "zeta"]


class TestGetActiveProvider:



    def test_single_available_among_many_autoresolves(self, tmp_path, monkeypatch):
        """When several providers are registered but only one has credentials
        (is_available()), that one is auto-selected without config. This is the
        DeepInfra-only-box case: fal/xai register unconditionally but lack keys.
        Mirrors agent/image_gen_registry's availability-filtered fallback.
        """
        monkeypatch.setenv("HERMES_HOME", str(tmp_path))
        video_gen_registry.register_provider(_FakeProvider("fal", available=False))
        video_gen_registry.register_provider(_FakeProvider("xai", available=False))
        video_gen_registry.register_provider(_FakeProvider("deepinfra", available=True))
        active = video_gen_registry.get_active_provider()
        assert active is not None and active.name == "deepinfra"


    def test_unknown_explicit_config_fails_closed(self, tmp_path, monkeypatch):
        """A typo must not silently route a paid request to another backend."""
        import yaml

        monkeypatch.setenv("HERMES_HOME", str(tmp_path))
        (tmp_path / "config.yaml").write_text(
            yaml.safe_dump({"video_gen": {"provider": "ghost"}})
        )
        video_gen_registry.register_provider(_FakeProvider("only"))
        assert video_gen_registry.get_active_provider() is None
