from __future__ import annotations

import pytest

from app.llm.registry import ModelRegistry


@pytest.mark.parametrize(
    ("model_id", "provider", "family", "api_model"),
    [
        ("claude-sonnet-4-6", "anthropic", "anthropic", "claude-sonnet-4-6"),
        ("claude-opus-4-20250514", "anthropic", "anthropic", "claude-opus-4-20250514"),
        ("gemini-2.5-flash", "gemini", "gemini", "gemini-2.5-flash"),
        ("gemini-2.0-pro", "gemini", "gemini", "gemini-2.0-pro"),
        ("deepseek-chat", "deepseek", "deepseek", "deepseek-chat"),
        ("deepseek-reasoner", "deepseek", "deepseek", "deepseek-reasoner"),
        ("gpt-4o", "openai", "openai-4-series", "gpt-4o"),
        ("gpt-4.1", "openai", "openai-4-series", "gpt-4.1"),
        ("gpt-5", "openai", "openai-5-series", "gpt-5"),
        ("gpt-5-mini", "openai", "openai-5-series", "gpt-5-mini"),
        ("o1", "openai", "openai-5-series", "o1"),
        ("o1-preview", "openai", "openai-5-series", "o1-preview"),
        ("o3-mini", "openai", "openai-5-series", "o3-mini"),
        ("openai-4-series", "openai", "openai-4-series", "gpt-4o"),
        ("openai-5-series", "openai", "openai-5-series", "o1"),
    ],
)
def test_resolve_known_models(model_id, provider, family, api_model, monkeypatch):
    monkeypatch.setattr("app.llm.registry.settings.LLM_MODEL", "gpt-4o")

    spec = ModelRegistry.resolve(model_id)

    assert spec.id == model_id
    assert spec.provider == provider
    assert spec.family == family
    assert spec.api_model == api_model


@pytest.mark.parametrize("model_id", [None, "", "   "])
def test_resolve_none_or_empty_falls_back_to_llm_model(model_id, monkeypatch):
    monkeypatch.setattr("app.llm.registry.settings.LLM_MODEL", "gpt-4o")

    spec = ModelRegistry.resolve(model_id)

    assert spec.provider == "openai"
    assert spec.family == "openai-4-series"
    assert spec.api_model == "gpt-4o"
    assert spec.id == "gpt-4o"


def test_resolve_unknown_falls_back_to_llm_model(monkeypatch):
    monkeypatch.setattr("app.llm.registry.settings.LLM_MODEL", "gpt-4o")

    spec = ModelRegistry.resolve("totally-unknown-model")

    assert spec.provider == "openai"
    assert spec.family == "openai-4-series"
    assert spec.api_model == "gpt-4o"
    assert spec.id == "gpt-4o"


def test_resolve_claude_does_not_bridge_to_gpt(monkeypatch):
    """Claude IDs must stay on Anthropic — no historical Claude→gpt-4o remap."""
    monkeypatch.setattr("app.llm.registry.settings.LLM_MODEL", "gpt-4o")

    spec = ModelRegistry.resolve("claude-sonnet-4-6")

    assert spec.provider == "anthropic"
    assert spec.api_model == "claude-sonnet-4-6"
    assert spec.api_model != "gpt-4o"
    assert "gpt" not in spec.api_model.lower()


def test_resolve_unknown_with_gpt5_default_family(monkeypatch):
    monkeypatch.setattr("app.llm.registry.settings.LLM_MODEL", "gpt-5")

    spec = ModelRegistry.resolve("mystery-model")

    assert spec.provider == "openai"
    assert spec.family == "openai-5-series"
    assert spec.api_model == "gpt-5"
