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

from app.services.beer_pairing import routes as beer_routes
from app.shared.middleware import auth as auth_middleware


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

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


@pytest.mark.anyio("asyncio")
async def test_beer_matcher_accepts_user_prompt(monkeypatch):
    stub_service = StubBeerPairingService()
    beer_routes.set_beer_pairing_service(stub_service)

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

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

    payload = {
        "language": "en",
        "foods": [{"name": "Steak Frites"}],
        "beers": [{"name": "West Coast IPA"}],
        "userPrompt": "add 3 more pale ales",
    }

    transport = ASGITransport(app=app)

    async with AsyncClient(transport=transport, base_url="http://test") as client:
        response = await client.post("/beer-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 pale ales"
    assert response.json()["results"] == []
