"""
Tests for Brave Search API integration.
"""

import os
import pytest
from urllib.parse import urlparse, parse_qs
from unittest.mock import AsyncMock, patch, MagicMock

import litellm
from tests.search_tests.base_search_unit_tests import BaseSearchTest


@pytest.mark.skip(reason="Not yet implemented")
class TestBraveSearch(BaseSearchTest):
    """
    Tests for Brave Search functionality with mocked network responses.
    """

    def get_search_provider(self) -> str:
        """Return the search provider name"""
        return "brave"

    @pytest.mark.asyncio
    async def test_basic_search(self):
        """
        Test basic search functionality with a simple query.
        """
        os.environ["BRAVE_API_KEY"] = "test-api-key"

        # Create a mock response
        mock_response = MagicMock()
        mock_response.status_code = 200
        mock_response.json.return_value = {
            "web": {
                "results": [
                    {
                        "title": "Test Result 1",
                        "url": "https://example.com/1",
                        "description": "This is a test snippet for result 1",
                    }
                ]
            }
        }

        # Mock the httpx AsyncClient get method
        with patch(
            "litellm.llms.custom_httpx.http_handler.AsyncHTTPHandler.get",
            new_callable=AsyncMock,
        ) as mock_get:
            mock_get.return_value = mock_response

            # Make the search call
            response = await litellm.asearch(
                query="Brave browser features",
                search_provider="brave",
                max_results=5,
                result_filter="web",
            )

            # Verify the get method was called once
            assert mock_get.call_count == 1

            # Get the actual call arguments
            call_args = mock_get.call_args

            # Verify URL (include_fetch_metadata=True is added by default)
            parsed_url = urlparse(call_args.kwargs["url"])
            assert parsed_url.scheme == "https"
            assert parsed_url.netloc == "api.search.brave.com"
            assert parsed_url.path == "/res/v1/web/search"

            query_params = parse_qs(parsed_url.query)
            assert query_params == {
                "q": ["Brave browser features"],
                "include_fetch_metadata": ["True"],
                "count": ["5"],
                "result_filter": ["web"],
            }

            # Verify headers contains X-Subscription-Token
            headers = call_args.kwargs.get("headers", {})
            assert "X-Subscription-Token" in headers
            assert headers["X-Subscription-Token"] == "test-api-key"

            # Note: Brave uses GET requests, so parameters are in the URL, not in JSON body
            # The URL already contains all the parameters we need to verify

            # Verify response structure
            assert hasattr(response, "results")
            assert hasattr(response, "object")
            assert response.object == "search"
            assert len(response.results) == 1

            # Verify first result
            first_result = response.results[0]
            assert first_result.title == "Test Result 1"
            assert first_result.url == "https://example.com/1"
            assert first_result.snippet == "This is a test snippet for result 1"
