"""Fixtures for API module tests."""

import pytest
from unittest.mock import MagicMock, patch


@pytest.fixture
def mock_llm():
    """Create a mock LLM."""
    mock = MagicMock()
    mock.invoke.return_value = MagicMock(content="Mocked LLM response")
    return mock


@pytest.fixture
def mock_search_engine():
    """Create a mock search engine."""
    mock = MagicMock()
    mock.run.return_value = [
        {
            "title": "Result 1",
            "link": "https://example.com/1",
            "snippet": "Snippet 1",
        },
        {
            "title": "Result 2",
            "link": "https://example.com/2",
            "snippet": "Snippet 2",
        },
    ]
    return mock


@pytest.fixture
def mock_search_system():
    """Create a mock AdvancedSearchSystem."""
    mock = MagicMock()
    mock.analyze_topic.return_value = {
        "current_knowledge": "Summary of findings",
        "findings": [{"content": "Finding 1"}, {"content": "Finding 2"}],
        "iterations": 2,
        "questions": {"1": ["Q1", "Q2"]},
        "formatted_findings": "Formatted findings text",
        "all_links_of_system": [
            {"title": "Source 1", "link": "https://example.com/1"},
        ],
    }
    mock.max_iterations = 2
    mock.questions_per_iteration = 3
    mock.model = MagicMock()
    return mock


@pytest.fixture
def mock_report_generator():
    """Create a mock report generator."""
    mock = MagicMock()
    mock.generate_report.return_value = {
        "content": "# Report\n\nReport content",
        "metadata": {"generated": "2024-01-01T00:00:00Z"},
    }
    return mock


@pytest.fixture
def sample_settings_snapshot():
    """Create a sample settings snapshot."""
    return {
        "llm.provider": {"value": "ollama", "ui_element": "select"},
        "llm.model": {"value": "gemma3:12b", "ui_element": "text"},
        "llm.temperature": {"value": 0.7, "ui_element": "range"},
        "search.tool": {"value": "auto", "ui_element": "select"},
        "search.iterations": {"value": 2, "ui_element": "number"},
        "search.questions_per_iteration": {"value": 3, "ui_element": "number"},
        "search.max_results": {"value": 20, "ui_element": "number"},
    }


@pytest.fixture
def mock_get_llm(mock_llm):
    """Mock get_llm function."""
    with patch(
        "local_deep_research.api.research_functions.get_llm",
        return_value=mock_llm,
    ):
        yield mock_llm


@pytest.fixture
def mock_get_search(mock_search_engine):
    """Mock get_search function."""
    with patch(
        "local_deep_research.api.research_functions.get_search",
        return_value=mock_search_engine,
    ):
        yield mock_search_engine


@pytest.fixture
def mock_advanced_search_system(mock_search_system):
    """Mock AdvancedSearchSystem class."""
    with patch(
        "local_deep_research.api.research_functions.AdvancedSearchSystem",
        return_value=mock_search_system,
    ):
        yield mock_search_system
