import pytest

pytestmark = pytest.mark.integration


@pytest.mark.asyncio
async def test_create_artist_returns_201(client):
    resp = await client.post("/api/artists", json={"name": "Alice"})
    assert resp.status_code == 201
    body = await resp.get_json()
    assert body["name"] == "Alice"
    assert body["slug"] == "alice"
    assert body["created"] is True


@pytest.mark.asyncio
async def test_create_artist_idempotent(client):
    a = await client.post("/api/artists", json={"name": "Bob"})
    b = await client.post("/api/artists", json={"name": "Bob"})
    assert (await a.get_json())["created"] is True
    body_b = await b.get_json()
    assert body_b["created"] is False
    assert body_b["id"] == (await a.get_json())["id"]


@pytest.mark.asyncio
async def test_create_artist_rejects_empty(client):
    resp = await client.post("/api/artists", json={"name": "   "})
    assert resp.status_code == 400


@pytest.mark.asyncio
async def test_autocomplete_returns_matches(client):
    await client.post("/api/artists", json={"name": "Alice"})
    await client.post("/api/artists", json={"name": "Alice Cooper"})
    await client.post("/api/artists", json={"name": "Bob"})
    resp = await client.get("/api/artists/autocomplete?q=alic")
    assert resp.status_code == 200
    names = [a["name"] for a in await resp.get_json()]
    assert "Alice" in names
    assert "Alice Cooper" in names
    assert "Bob" not in names


@pytest.mark.asyncio
async def test_autocomplete_empty_query(client):
    resp = await client.get("/api/artists/autocomplete?q=")
    assert resp.status_code == 200
    assert await resp.get_json() == []


@pytest.mark.asyncio
async def test_patch_renames_display_name_only(client):
    # #130: PATCH renames the display name; slug unchanged (paths safe).
    created = await (await client.post("/api/artists", json={"name": "12345678"})).get_json()
    resp = await client.patch(
        f"/api/artists/{created['id']}", json={"name": "Kurotsuchi Machi"}
    )
    assert resp.status_code == 200
    body = await resp.get_json()
    assert body["name"] == "Kurotsuchi Machi"
    assert body["slug"] == created["slug"]        # slug frozen


@pytest.mark.asyncio
async def test_patch_rename_validation(client):
    created = await (await client.post("/api/artists", json={"name": "Nn"})).get_json()
    assert (await client.patch(
        f"/api/artists/{created['id']}", json={"name": "  "}
    )).status_code == 400
    assert (await client.patch(
        f"/api/artists/{created['id']}", json={})).status_code == 400
    assert (await client.patch(
        "/api/artists/999999", json={"name": "Ghost"})).status_code == 404
