from __future__ import annotations

import pytest

from app.generation.llm_client import LLMAuthError
from app.models.llm_models import ModelEntry, ModelsResponse


@pytest.fixture
def mock_models_service(monkeypatch):
    async def fake_list_models():
        return ModelsResponse(
            models=[
                ModelEntry(
                    id="gpt-4o",
                    owned_by="openai",
                    created=1,
                    default=True,
                    default_intent=False,
                    available=True,
                ),
                ModelEntry(
                    id="gpt-4o-mini",
                    owned_by="openai",
                    created=2,
                    default=False,
                    default_intent=True,
                    available=True,
                ),
            ],
            default_model="gpt-4o",
            default_intent_model="gpt-4o-mini",
        )

    monkeypatch.setattr(
        "app.api.routes.models._models_service.list_models",
        fake_list_models,
    )


def test_list_models_route(client, mock_models_service):
    response = client.get("/api/v1/models/")

    assert response.status_code == 200
    body = response.json()
    assert body["default_model"] == "gpt-4o"
    assert body["default_intent_model"] == "gpt-4o-mini"
    assert len(body["models"]) == 2
    assert body["models"][0]["id"] == "gpt-4o"


def test_list_models_route_maps_openai_auth_error(client, monkeypatch):
    async def raise_auth_error():
        raise LLMAuthError("invalid key", status_code=401)

    monkeypatch.setattr(
        "app.api.routes.models._models_service.list_models",
        raise_auth_error,
    )

    response = client.get("/api/v1/models/")
    assert response.status_code == 502
