import pytest
from app.services.llm import _routing_overrides


@pytest.fixture(autouse=True)
def clean_overrides():
    _routing_overrides.clear()
    yield
    _routing_overrides.clear()


class TestGetRoutingAPI:
    def test_authed_returns_data(self, client):
        resp = client.get("/api/llm-routing")
        assert resp.status_code == 200
        data = resp.json()
        assert "stages" in data
        assert "routes" in data
        assert "providers" in data
        assert "provider_status" in data

    def test_unauthed_returns_401(self, unauthed_client):
        resp = unauthed_client.get("/api/llm-routing")
        assert resp.status_code == 401

    def test_all_stages_in_response(self, client):
        data = client.get("/api/llm-routing").json()
        assert len(data["stages"]) >= 11
        assert len(data["routes"]) >= 11

    def test_all_4_providers_in_response(self, client):
        data = client.get("/api/llm-routing").json()
        assert len(data["providers"]) == 4


class TestSetRouteAPI:
    def test_valid_override(self, client):
        resp = client.post("/api/llm-routing/domain_analysis", json={
            "provider": "gemini",
            "model": "gemini-2.5-pro"
        })
        assert resp.status_code == 200
        data = resp.json()
        assert data["success"] is True
        assert data["route"]["provider"] == "gemini"
        assert data["route"]["is_override"] is True

    def test_missing_provider_errors(self, client):
        resp = client.post("/api/llm-routing/domain_analysis", json={
            "model": "gemini-2.5-pro"
        })
        data = resp.json()
        assert "error" in data

    def test_missing_model_errors(self, client):
        resp = client.post("/api/llm-routing/domain_analysis", json={
            "provider": "gemini"
        })
        data = resp.json()
        assert "error" in data

    def test_invalid_stage_errors(self, client):
        resp = client.post("/api/llm-routing/fake_stage", json={
            "provider": "openai",
            "model": "gpt-5"
        })
        data = resp.json()
        assert "error" in data

    def test_mode_incompatible_errors(self, client):
        resp = client.post("/api/llm-routing/hero_image", json={
            "provider": "gemini",
            "model": "gemini-2.5-pro"
        })
        data = resp.json()
        assert "error" in data

    def test_override_persists_in_get(self, client):
        client.post("/api/llm-routing/domain_analysis", json={
            "provider": "gemini",
            "model": "gemini-2.5-pro"
        })
        data = client.get("/api/llm-routing").json()
        route = data["routes"]["domain_analysis"]
        assert route["is_override"] is True
        assert route["provider"] == "gemini"


class TestDeleteRouteAPI:
    def test_reset_override(self, client):
        client.post("/api/llm-routing/domain_analysis", json={
            "provider": "gemini",
            "model": "gemini-2.5-pro"
        })
        resp = client.delete("/api/llm-routing/domain_analysis")
        assert resp.status_code == 200
        data = resp.json()
        assert data["route"]["is_override"] is False

    def test_reset_nonexistent_no_error(self, client):
        resp = client.delete("/api/llm-routing/domain_analysis")
        assert resp.status_code == 200


class TestDevAdminRoutingPage:
    def test_valid_token_loads_page(self, unauthed_client, dev_token):
        resp = unauthed_client.get(f"/_dev_admin/{dev_token}/llm-routing")
        assert resp.status_code == 200
        assert "LLM Pipeline Routing Rules" in resp.text

    def test_invalid_token_rejected(self, unauthed_client):
        resp = unauthed_client.get("/_dev_admin/wrong_token/llm-routing")
        assert resp.status_code == 403

    def test_authed_admin_page_loads(self, client):
        resp = client.get("/admin/llm-routing")
        assert resp.status_code == 200
        assert "Pipeline Stage Routing" in resp.text
