import pytest
from fastapi import FastAPI
from httpx import AsyncClient, ASGITransport

from app.services.wine_pairing import routes as wine_routes
from app.shared.middleware import auth as auth_middleware


class StubWinePairingService:
    def __init__(self):
        self.seen_request = None

    async def match_wines(self, request):
        self.seen_request = request
        return {
            "language": request.language,
            "results": [],
        }


@pytest.mark.anyio("asyncio")
async def test_wine_matcher_accepts_user_prompt(monkeypatch):
    stub_service = StubWinePairingService()
    wine_routes.set_wine_pairing_service(stub_service)

    mock_auth_manager = auth_middleware.ServiceAuthManager("fallback", {"wine_pairing": "token"})
    monkeypatch.setattr(auth_middleware, "auth_manager", mock_auth_manager, raising=False)

    app = FastAPI()
    app.include_router(wine_routes.router)

    payload = {
        "language": "en",
        "foods": [{"name": "Steak Frites"}],
        "wines": [{"name": "Cabernet Sauvignon"}],
        "userPrompt": "add 3 more bottles rose wine",
    }

    transport = ASGITransport(app=app)

    async with AsyncClient(transport=transport, base_url="http://test") as client:
        response = await client.post("/wine-matcher", json=payload, headers={"Authorization": "Bearer token"})

    assert response.status_code == 200
    assert stub_service.seen_request is not None
    assert stub_service.seen_request.user_prompt == "add 3 more bottles rose wine"
    assert response.json()["results"] == []
