import json


def add(client, name, score, headers, board="global"):
    client.post(
        f"/{board}/add",
        data=json.dumps({"name": name, "score": score}),
        headers=headers,
    )


class TestDeleteAll:
    def test_clears_all_entries(self, client, auth_headers):
        add(client, "Alice", 100, auth_headers)
        add(client, "Bob", 200, auth_headers)

        resp = client.delete("/global/all", headers=auth_headers)
        assert resp.status_code == 200
        assert resp.get_json()["deleted"] is True
        assert client.get("/global/top/10").get_json() == []

    def test_only_affects_target_leaderboard(self, client, auth_headers):
        add(client, "Alice", 100, auth_headers, board="global")
        add(client, "Bob", 200, auth_headers, board="weekly")

        client.delete("/global/all", headers=auth_headers)

        # Weekly should be untouched
        weekly = client.get("/weekly/top/10").get_json()
        assert len(weekly) == 1
        assert weekly[0]["name"] == "Bob"

    def test_requires_api_key(self, client):
        assert client.delete("/global/all").status_code == 401

    def test_invalid_leaderboard_returns_404(self, client, auth_headers):
        assert client.delete("/nonexistent/all", headers=auth_headers).status_code == 404


class TestDeleteById:
    def test_deletes_specific_entry(self, client, auth_headers):
        add(client, "Alice", 100, auth_headers)
        add(client, "Bob", 200, auth_headers)

        entry_id = client.get("/global/top/1").get_json()[0]["id"]

        resp = client.delete(f"/global/{entry_id}", headers=auth_headers)
        assert resp.status_code == 200
        assert resp.get_json()["deleted"] is True

        remaining_ids = [e["id"] for e in client.get("/global/top/10").get_json()]
        assert entry_id not in remaining_ids

    def test_leaves_other_entries_intact(self, client, auth_headers):
        add(client, "Alice", 100, auth_headers)
        add(client, "Bob", 200, auth_headers)

        bob_id = client.get("/global/top/1").get_json()[0]["id"]
        client.delete(f"/global/{bob_id}", headers=auth_headers)

        remaining = client.get("/global/top/10").get_json()
        assert len(remaining) == 1
        assert remaining[0]["name"] == "Alice"

    def test_nonexistent_id_returns_404(self, client, auth_headers):
        assert client.delete("/global/99999", headers=auth_headers).status_code == 404

    def test_requires_api_key(self, client):
        assert client.delete("/global/1").status_code == 401

    def test_invalid_leaderboard_returns_404(self, client, auth_headers):
        assert client.delete("/nonexistent/1", headers=auth_headers).status_code == 404
