import pytest
from fastapi.testclient import TestClient


@pytest.fixture
def client():
    from app.main import app

    return TestClient(app)


def test_query_stream_returns_sse(client, monkeypatch):
    async def fake_preflight(body, request_id=None):
        return None

    async def fake_stream(body, request_id=None, user_id=None):
        yield "event: start\ndata: {}\n\n"
        yield 'event: token\ndata: {"delta":"hi"}\n\n'
        yield 'event: done\ndata: {"latency_ms":1,"model":"gpt-4o","answer":"ok","answer_length":2}\n\n'

    monkeypatch.setattr(
        "app.api.routes.query._query_service.preflight",
        fake_preflight,
    )
    monkeypatch.setattr(
        "app.api.routes.query._query_service.stream_query",
        fake_stream,
    )
    response = client.post(
        "/api/v1/query/",
        json={
            "repo_id": "ad/example.com",
            "question": "test?",
            "options": {"stream": True},
        },
    )
    assert response.status_code == 200
    assert response.headers["content-type"].startswith("text/event-stream")
    assert "event: start" in response.text
    assert "event: done" in response.text


def test_query_stream_with_deliverable_returns_422(client, monkeypatch):
    async def fake_preflight(body, request_id=None):
        raise ValueError("deliverable generation is not supported with streaming in v1")

    monkeypatch.setattr(
        "app.api.routes.query._query_service.preflight",
        fake_preflight,
    )
    response = client.post(
        "/api/v1/query/",
        json={
            "repo_id": "ad/example.com",
            "question": "generate a doc",
            "options": {
                "stream": True,
                "deliverable": {"enabled": True, "format": "markdown"},
            },
        },
    )
    assert response.status_code == 422
    assert "deliverable generation" in response.json()["detail"]


def test_query_empty_mock_retrieval(client, monkeypatch):
    async def fake_query(body, request_id=None, user_id=None):
        from app.models.intent import IntentResult, QueryIntent
        from app.models.query import QueryMetadata, QueryResponse
        from app.models.search import SearchMetadata

        return QueryResponse(
            request_id="req_x",
            repo_id=body.repo_id,
            snapshot_id="snap_x",
            question=body.question,
            intent=IntentResult(
                type=QueryIntent.GENERAL,
                confidence=0.5,
                source_types_used=[],
            ),
            answer="No context found.",
            metadata=QueryMetadata(latency_ms=1),
        )

    monkeypatch.setattr(
        "app.api.routes.query._query_service.query",
        fake_query,
    )
    response = client.post(
        "/api/v1/query/",
        json={"repo_id": "ad/example.com", "question": "hello?"},
    )
    assert response.status_code == 200
    assert response.json()["answer"] == "No context found."
