"""Tests for API key management endpoints."""

import pytest


@pytest.mark.asyncio
async def test_create_api_key(api_client):
    """Test creating a new API key."""
    resp = await api_client.post(
        "/api/auth/keys",
        json={
            "name": "my-dev-key",
            "environment": "test",
        },
    )
    # In local mode with in-memory SQLite, should succeed
    # Accept 201 (created) or 422 (validation error if schema changed)
    # Reject 404/405/500 as those indicate broken endpoint
    assert resp.status_code in (201, 422), f"Unexpected status {resp.status_code}: {resp.text}"
    if resp.status_code == 201:
        data = resp.json()
        assert "key" in data
        assert data["key"].startswith("ad_test_")


@pytest.mark.asyncio
async def test_list_api_keys(api_client):
    """Test listing API keys."""
    # First create a key to ensure list has something
    await api_client.post("/api/auth/keys", json={"name": "list-test-key"})

    resp = await api_client.get("/api/auth/keys")
    # Accept 200 (ok) or 422 (validation error)
    # Reject 404/500 as those indicate broken endpoint
    assert resp.status_code in (200, 422), f"Unexpected status {resp.status_code}: {resp.text}"
    if resp.status_code == 200:
        data = resp.json()
        assert isinstance(data, list)


@pytest.mark.asyncio
async def test_revoke_api_key(api_client):
    """Test revoking an API key."""
    # First create a key to revoke
    create_resp = await api_client.post("/api/auth/keys", json={"name": "revoke-test-key"})
    if create_resp.status_code != 201:
        pytest.skip("Could not create key for revoke test")

    key_id = create_resp.json()["id"]

    resp = await api_client.delete(f"/api/auth/keys/{key_id}")
    # Accept 204 (no content) or 404 (key not found - race condition)
    # Reject 405/500/422 as those indicate broken endpoint
    assert resp.status_code in (204, 404), f"Unexpected status {resp.status_code}: {resp.text}"


@pytest.mark.asyncio
async def test_revoke_nonexistent_key_returns_404(api_client):
    """Test that revoking a non-existent key returns 404."""
    resp = await api_client.delete("/api/auth/keys/nonexistent-key-id-12345")
    # Should be 404 - the key doesn't exist
    # Accept only 404, reject other codes
    assert resp.status_code == 404, f"Expected 404, got {resp.status_code}"
