"""
Fixtures for LLM provider tests.
"""

import pytest
from unittest.mock import Mock


@pytest.fixture
def mock_settings_snapshot():
    """Create a mock settings snapshot for testing."""
    return {
        "llm.openai.api_key": "test-openai-key",
        "llm.ollama.url": "http://localhost:11434",
        "llm.ollama.api_key": "",
        "llm.max_tokens": 4096,
        "llm.streaming": True,
        "llm.max_retries": 3,
        "llm.request_timeout": 60,
        "llm.local_context_window_size": 8192,
        "llm.supports_max_tokens": True,
    }


@pytest.fixture
def mock_empty_settings():
    """Create empty settings snapshot (no API keys configured)."""
    return {}


@pytest.fixture
def mock_openai_client():
    """Create a mock OpenAI client."""
    client = Mock()

    # Mock models list response
    mock_model1 = Mock()
    mock_model1.id = "gpt-4"
    mock_model2 = Mock()
    mock_model2.id = "gpt-3.5-turbo"

    models_response = Mock()
    models_response.data = [mock_model1, mock_model2]
    client.models.list.return_value = models_response

    return client


@pytest.fixture
def mock_ollama_response():
    """Create a mock Ollama API response."""
    return {
        "models": [
            {"name": "llama2:latest", "size": 3826793472},
            {"name": "gemma:latest", "size": 2948523008},
            {"name": "codellama:latest", "size": 3826793472},
        ]
    }


@pytest.fixture
def mock_chat_completion():
    """Create a mock chat completion response."""
    response = Mock()
    response.choices = [Mock(message=Mock(content="This is a test response."))]
    return response


@pytest.fixture
def mock_provider_class():
    """Create a mock provider class for testing discovery."""

    class MockProvider:
        provider_name = "Mock Provider"
        provider_key = "MOCK"
        company_name = "Mock Company"
        is_cloud = True
        api_key_setting = "llm.mock.api_key"
        default_base_url = "https://api.mock.com/v1"
        default_model = "mock-model-1"

        @classmethod
        def requires_auth_for_models(cls):
            return True

        @classmethod
        def create_llm(cls, model_name=None, temperature=0.7, **kwargs):
            return Mock()

        @classmethod
        def is_available(cls, settings_snapshot=None):
            return True

    return MockProvider


@pytest.fixture
def mock_local_provider_class():
    """Create a mock local provider class (no API key required)."""

    class MockLocalProvider:
        provider_name = "Mock Local"
        provider_key = "MOCK_LOCAL"
        company_name = "Local"
        is_cloud = False
        api_key_setting = None  # No API key required
        default_base_url = "http://localhost:8080"
        default_model = "local-model"

        @classmethod
        def requires_auth_for_models(cls):
            return False

        @classmethod
        def create_llm(cls, model_name=None, temperature=0.7, **kwargs):
            return Mock()

        @classmethod
        def is_available(cls, settings_snapshot=None):
            return True

    return MockLocalProvider
