import uuid
from datetime import datetime
from unittest.mock import AsyncMock, patch

import pytest


@pytest.fixture
def mock_citation_record():
    """Return a mock citation record."""
    record = AsyncMock()
    record.id = uuid.UUID("32345678-1234-1234-1234-123456789abc")
    record.query_id = uuid.UUID("22345678-1234-1234-1234-123456789abc")
    record.platform = "wenxin"
    record.cited = True
    record.citation_position = 1
    record.citation_text = "Test citation text"
    record.competitor_brands = []
    record.queried_at = datetime.now()
    return record


@pytest.mark.asyncio
async def test_get_citations(
    async_client, override_get_current_user, auth_headers, mock_citation_record
):
    with patch(
        "app.api.citations.get_citations",
        return_value=([mock_citation_record], 1),
    ):
        response = await async_client.get(
            "/api/v1/citations/",
            headers=auth_headers,
        )
    assert response.status_code == 200
    data = response.json()
    assert data["total"] == 1
    assert len(data["items"]) == 1
    assert data["items"][0]["platform"] == "wenxin"
    assert data["items"][0]["cited"] is True


@pytest.mark.asyncio
async def test_get_citation_stats(
    async_client, override_get_current_user, auth_headers
):
    stats = {
        "total_queries": 10,
        "total_citations": 7,
        "citation_rate": 0.7,
        "avg_position": 2.5,
        "by_platform": {
            "wenxin": {
                "queries": 5,
                "citations": 4,
                "rate": 0.8,
                "avg_position": 2.0,
            }
        },
        "trend": [{"date": "2024-01-01", "citations": 3}],
    }
    with patch("app.api.citations.get_citation_stats", return_value=stats):
        response = await async_client.get(
            "/api/v1/citations/stats",
            headers=auth_headers,
        )
    assert response.status_code == 200
    data = response.json()
    assert data["total_queries"] == 10
    assert data["total_citations"] == 7
    assert data["citation_rate"] == 0.7
    assert "wenxin" in data["by_platform"]


@pytest.mark.asyncio
async def test_export_csv(
    async_client, override_get_current_user, auth_headers
):
    csv_content = "日期,平台,是否引用,引用位置,引用文本,竞争品牌\n2024-01-01,wenxin,是,1,test,\n"
    with patch(
        "app.api.reports.export_citations_csv",
        return_value=csv_content,
    ):
        response = await async_client.get(
            "/api/v1/reports/export/csv?query_id=22345678-1234-1234-1234-123456789abc",
            headers=auth_headers,
        )
    assert response.status_code == 200
    assert response.headers["content-type"].startswith("text/csv")
    assert "attachment" in response.headers["content-disposition"]
    body = response.text
    assert "wenxin" in body
