import pytest

pytestmark = pytest.mark.requires_postgres


def _admin_headers() -> dict:
    return {"Authorization": "Bearer test-admin-token"}


def _new_ingredient(client, name: str) -> str:
    r = client.post(
        "/api/admin/ingredients",
        json={"name": name, "aliases": [], "aisle": "pantry", "unit": "ea"},
        headers=_admin_headers(),
    )
    assert r.status_code == 201, r.text
    return r.json()["id"]


def test_create_recipe_with_canonical_ingredients(client):
    chicken = _new_ingredient(client, "Test Chicken Thighs Recipe1")
    olive_oil = _new_ingredient(client, "Test Olive Oil Recipe1")
    body = {
        "name": "Test Sheet-Pan Chicken",
        "prep_time_minutes": 10,
        "cook_time_minutes": 30,
        "servings": 4,
        "cuisine_tags": ["american"],
        "dietary_tags": [],
        "protein_type": "chicken",
        "calories_per_serving": 520,
        "ingredients": [
            {"ingredient_id": chicken, "qty": 2.0, "unit": "lb"},
            {"ingredient_id": olive_oil, "qty": 2.0, "unit": "tbsp"},
        ],
        "instructions": ["Preheat oven to 425", "Roast 30 min"],
    }
    r = client.post("/api/admin/recipes", json=body, headers=_admin_headers())
    assert r.status_code == 201, r.text
    data = r.json()
    assert data["id"]
    assert len(data["ingredients"]) == 2


def test_create_recipe_rejects_unknown_ingredient_id(client):
    body = {
        "name": "Test Bogus Recipe",
        "prep_time_minutes": 5,
        "cook_time_minutes": 5,
        "servings": 4,
        "cuisine_tags": [],
        "dietary_tags": [],
        "protein_type": "vegetarian",
        "ingredients": [
            {"ingredient_id": "00000000-0000-0000-0000-000000000000", "qty": 1, "unit": "ea"}
        ],
        "instructions": ["nope"],
    }
    r = client.post("/api/admin/recipes", json=body, headers=_admin_headers())
    assert r.status_code == 422


def test_list_recipes_returns_seeded_data(client):
    chicken = _new_ingredient(client, "Test Chicken Thighs Recipe2")
    client.post(
        "/api/admin/recipes",
        json={
            "name": "Test Listable Recipe",
            "prep_time_minutes": 5,
            "cook_time_minutes": 25,
            "servings": 4,
            "cuisine_tags": ["american"],
            "dietary_tags": [],
            "protein_type": "chicken",
            "ingredients": [{"ingredient_id": chicken, "qty": 1, "unit": "lb"}],
            "instructions": ["cook"],
        },
        headers=_admin_headers(),
    )
    r = client.get("/api/recipes")
    assert r.status_code == 200
    names = {row["name"] for row in r.json()}
    assert "Test Listable Recipe" in names
