"""`GET /jobs/{id}` (spec socle §3) : filtré par organisation, Problem Details."""

import uuid
from collections.abc import Callable

from httpx import AsyncClient

from tests.test_jobs_worker import enqueue, make_factory, new_org

Headers = Callable[[str], dict[str, str]]


async def test_get_job_returns_its_state(client: AsyncClient, auth_headers: Headers) -> None:
    org = new_org()
    job = await enqueue(make_factory(), org, "test_ok", payload={"x": 1})
    resp = await client.get(f"/jobs/{job.id}", headers=auth_headers(org))
    assert resp.status_code == 200, resp.text
    body = resp.json()
    assert body["id"] == str(job.id)
    assert body["type"] == "test_ok"
    assert body["status"] == "queued"
    assert body["progress"] is None and body["report"] is None and body["error"] is None
    assert body["started_at"] is None and body["finished_at"] is None
    # Le payload et les compteurs internes ne sortent jamais de l'api.
    assert set(body) == {
        "id",
        "type",
        "status",
        "progress",
        "report",
        "error",
        "created_at",
        "started_at",
        "finished_at",
    }


async def test_get_job_of_other_org_is_404(client: AsyncClient, auth_headers: Headers) -> None:
    job = await enqueue(make_factory(), new_org(), "test_ok")
    resp = await client.get(f"/jobs/{job.id}", headers=auth_headers(new_org()))
    assert resp.status_code == 404  # jamais 403 : ne pas révéler l'existence
    assert resp.headers["content-type"].startswith("application/problem+json")


async def test_get_unknown_job_is_404(client: AsyncClient, auth_headers: Headers) -> None:
    resp = await client.get(f"/jobs/{uuid.uuid4()}", headers=auth_headers(new_org()))
    assert resp.status_code == 404
    assert resp.json()["detail"] == "Job inconnu"


async def test_get_job_with_bad_uuid_is_422(client: AsyncClient, auth_headers: Headers) -> None:
    resp = await client.get("/jobs/pas-un-uuid", headers=auth_headers(new_org()))
    assert resp.status_code == 422


async def test_get_job_without_active_org_is_404(client: AsyncClient, test_private_key) -> None:
    from tests.test_me import make_token

    token = make_token(test_private_key, org_id=None)
    resp = await client.get(f"/jobs/{uuid.uuid4()}", headers={"Authorization": f"Bearer {token}"})
    assert resp.status_code == 404
    assert resp.json()["detail"] == "Aucune organisation active"


async def test_get_job_without_token_is_401(client: AsyncClient) -> None:
    resp = await client.get(f"/jobs/{uuid.uuid4()}")
    assert resp.status_code == 401
