"""Save-as-draft and resume (FormSettings.allow_drafts): a draft skips
required/validation checks, is visible only to whoever saved it, and stays
out of lists and queries until it's submitted."""

from tests.test_enterprise_access import _person

FIELDS = [{"name": "title", "type": "text", "label": "Title", "required": True}, {"name": "amount", "type": "number", "label": "Amount", "required": True}]


async def _form(client, headers, allow_drafts=True):
    form = (await client.post("/forms", headers=headers, json={"name": "Claim", "field_definitions": FIELDS, "settings": {"allow_drafts": allow_drafts}})).json()
    await client.post(f"/forms/{form['form_id']}/publish", headers=headers)
    return form


async def test_drafts_need_the_setting(client, auth_headers):
    form = await _form(client, auth_headers, allow_drafts=False)
    resp = await client.post("/form-submissions", headers=auth_headers, json={"form_id": form["form_id"], "form_version": 1, "field_values": {}, "draft": True})
    assert resp.status_code == 422


async def test_draft_lifecycle(client, auth_headers, test_tenant):
    form = await _form(client, auth_headers)
    assert form["settings"]["allow_drafts"] is True
    fid = form["form_id"]
    draft = await client.post("/form-submissions", headers=auth_headers, json={"form_id": fid, "form_version": 1, "field_values": {"title": "Half done"}, "draft": True})
    assert draft.status_code == 201, draft.text
    assert draft.json()["status"] == "draft"
    did = draft.json()["id"]

    # Not part of the data yet.
    assert (await client.get(f"/forms/{fid}/submissions", headers=auth_headers)).json() == []
    assert (await client.get(f"/forms/{fid}/submissions/count", headers=auth_headers)).json()["total"] == 0
    query = await client.post("/datasets/query", headers=auth_headers, json={"source_type": "form", "source_id": fid})
    assert query.json()["rows"] == []

    # Only its owner sees it.
    other = await _person(test_tenant["tenant_id"], "Other")
    assert (await client.get(f"/form-submissions/{did}", headers=other["headers"])).status_code == 404
    assert [d["id"] for d in (await client.get(f"/forms/{fid}/drafts", headers=auth_headers)).json()] == [did]
    assert (await client.get(f"/forms/{fid}/drafts", headers=other["headers"])).json() == []

    # Still a draft after another save; submitting needs the required fields.
    resave = await client.patch(f"/form-submissions/{did}", headers=auth_headers, json={"field_values": {"title": "Nearly"}})
    assert resave.status_code == 200 and resave.json()["status"] == "draft"
    bad = await client.patch(f"/form-submissions/{did}", headers=auth_headers, json={"field_values": {"title": "Nearly"}, "submit": True})
    assert bad.status_code == 422
    ok = await client.patch(f"/form-submissions/{did}", headers=auth_headers, json={"field_values": {"title": "Done", "amount": 5}, "submit": True})
    assert ok.status_code == 200 and ok.json()["status"] == "submitted"
    assert [s["id"] for s in (await client.get(f"/forms/{fid}/submissions", headers=auth_headers)).json()] == [did]
    assert (await client.get(f"/forms/{fid}/drafts", headers=auth_headers)).json() == []
