"""Fixtures for follow-up research tests."""

import pytest
from unittest.mock import MagicMock, patch
from contextlib import contextmanager


@pytest.fixture
def mock_user_db_session():
    """Mock the database session context manager."""
    session_mock = MagicMock()

    @contextmanager
    def _mock_session(username, password=None):
        yield session_mock

    with patch(
        "local_deep_research.followup_research.service.get_user_db_session",
        side_effect=_mock_session,
    ):
        yield session_mock


@pytest.fixture
def mock_research_history():
    """Create a mock ResearchHistory object."""
    research = MagicMock()
    research.id = "test-parent-id"
    research.query = "Original research query"
    research.report_content = "# Research Report\n\nThis is the report content."
    research.research_meta = {
        "formatted_findings": "Finding 1\nFinding 2",
        "strategy_name": "standard",
        "all_links_of_system": [
            {"title": "Source 1", "link": "https://example.com/1"},
            {"title": "Source 2", "link": "https://example.com/2"},
        ],
    }
    return research


@pytest.fixture
def mock_research_sources_service():
    """Mock the ResearchSourcesService."""
    service_mock = MagicMock()
    service_mock.get_research_sources.return_value = [
        {
            "title": "Source 1",
            "link": "https://example.com/1",
            "snippet": "Snippet 1",
        },
        {
            "title": "Source 2",
            "link": "https://example.com/2",
            "snippet": "Snippet 2",
        },
    ]
    service_mock.save_research_sources.return_value = 2

    with patch(
        "local_deep_research.followup_research.service.ResearchSourcesService",
        return_value=service_mock,
    ):
        yield service_mock


@pytest.fixture
def sample_followup_request():
    """Create a sample FollowUpRequest."""
    from local_deep_research.followup_research.models import FollowUpRequest

    return FollowUpRequest(
        parent_research_id="test-parent-id",
        question="What are the implications of these findings?",
        strategy="source-based",
        max_iterations=2,
        questions_per_iteration=3,
    )


@pytest.fixture
def sample_followup_response():
    """Create a sample FollowUpResponse."""
    from local_deep_research.followup_research.models import (
        FollowUpResponse,
    )

    return FollowUpResponse(
        research_id="test-followup-id",
        question="What are the implications?",
        answer="The implications are significant.",
        sources_used=[
            {"title": "Source 1", "url": "https://example.com/1"},
        ],
        parent_context_used=True,
        reused_links_count=2,
        new_links_count=3,
    )


@pytest.fixture
def mock_settings_manager():
    """Mock the SettingsManager."""
    manager_mock = MagicMock()
    manager_mock.get_all_settings.return_value = {
        "search.search_strategy": {"value": "source-based"},
        "search.iterations": {"value": 2},
        "search.questions_per_iteration": {"value": 3},
        "llm.provider": {"value": "ollama"},
        "llm.model": {"value": "gemma3:12b"},
        "search.tool": {"value": "searxng"},
    }
    return manager_mock
