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

from app.services.insert_menu_items import routes as insert_routes
from app.shared.middleware import auth as auth_middleware


class StubInsertMenuItemsService:
    def __init__(self):
        self.calls = []

    async def process_menu_upload(self, **kwargs):
        self.calls.append(kwargs)


@pytest.mark.anyio("asyncio")
@pytest.mark.parametrize(
    ("field_name", "field_value"),
    [
        ("zavedenia_id", "3054"),
        ("zavedeniaId", "3055"),
        ("zavedeniaID", "3056"),
        ("zavedenie_id", "3057"),
        ("zId", "3058"),
        ("restaurantId", "3059"),
        ("venue_id", "3060"),
    ],
)
async def test_insert_menu_items_resolves_zavedenia_id_aliases(monkeypatch, field_name, field_value):
    stub_service = StubInsertMenuItemsService()
    insert_routes.set_insert_menu_items_service(stub_service)

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

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

    transport = ASGITransport(app=app)
    data = {
        "city": "sofia",
        "token": "create-menu-token",
        "source_language": "bg",
        "target_language": "en",
        field_name: field_value,
    }
    files = {
        "file": ("menu.jpg", b"fake-image-bytes", "image/jpeg"),
    }

    async with AsyncClient(transport=transport, base_url="http://test") as client:
        response = await client.post(
            "/menu-items/insert",
            data=data,
            files=files,
            headers={"Authorization": "Bearer token"},
        )

    assert response.status_code == 202
    assert stub_service.calls
    assert stub_service.calls[0]["zavedenia_id"] == int(field_value)


@pytest.mark.anyio("asyncio")
@pytest.mark.parametrize(
    ("request_data", "expected_vanue_name"),
    [
        ({"vanueName": "Restaurant Test"}, "Restaurant Test"),
        ({}, ""),
    ],
)
async def test_insert_menu_items_accepts_optional_vanue_name(
    monkeypatch,
    request_data,
    expected_vanue_name,
):
    stub_service = StubInsertMenuItemsService()
    insert_routes.set_insert_menu_items_service(stub_service)

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

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

    transport = ASGITransport(app=app)
    data = {
        "city": "sofia",
        "token": "create-menu-token",
        **request_data,
    }
    files = {
        "file": ("menu.jpg", b"fake-image-bytes", "image/jpeg"),
    }

    async with AsyncClient(transport=transport, base_url="http://test") as client:
        response = await client.post(
            "/menu-items/insert",
            data=data,
            files=files,
            headers={"Authorization": "Bearer token"},
        )

    assert response.status_code == 202
    assert stub_service.calls[0]["vanue_name"] == expected_vanue_name
