"""Covers app/routers/form_submissions.py's new update/delete endpoints and
app/routers/forms.py's search+count additions to list_form_submissions —
added so a Page Designer Data List block bound to a Form can offer the same
add/search/edit/delete parity a Master-sourced Data List already has."""


async def _create_published_form(client, headers) -> dict:
    resp = await client.post(
        "/forms",
        headers=headers,
        json={
            "name": "Pytest Feedback Form",
            "field_definitions": [
                {"name": "subject", "type": "text", "label": "Subject", "required": True},
                {"name": "notes", "type": "textarea", "label": "Notes", "required": False},
            ],
        },
    )
    assert resp.status_code == 201
    form = resp.json()
    publish_resp = await client.post(f"/forms/{form['form_id']}/publish", headers=headers)
    assert publish_resp.status_code == 200
    return publish_resp.json()


async def test_form_submission_crud_and_search(client, auth_headers):
    form = await _create_published_form(client, auth_headers)

    create_resp = await client.post(
        "/form-submissions",
        headers=auth_headers,
        json={
            "form_id": form["form_id"],
            "form_version": form["version"],
            "field_values": {"subject": "Broken login", "notes": "Cannot sign in"},
        },
    )
    assert create_resp.status_code == 201
    submission = create_resp.json()

    other_resp = await client.post(
        "/form-submissions",
        headers=auth_headers,
        json={
            "form_id": form["form_id"],
            "form_version": form["version"],
            "field_values": {"subject": "Billing question", "notes": "Invoice mismatch"},
        },
    )
    assert other_resp.status_code == 201

    list_resp = await client.get(f"/forms/{form['form_id']}/submissions", headers=auth_headers)
    assert list_resp.status_code == 200
    assert len(list_resp.json()) == 2

    search_resp = await client.get(
        f"/forms/{form['form_id']}/submissions", headers=auth_headers, params={"q": "billing"}
    )
    assert search_resp.status_code == 200
    matched = search_resp.json()
    assert len(matched) == 1
    assert matched[0]["field_values"]["subject"] == "Billing question"

    count_resp = await client.get(f"/forms/{form['form_id']}/submissions/count", headers=auth_headers)
    assert count_resp.status_code == 200
    assert count_resp.json()["total"] == 2

    count_search_resp = await client.get(
        f"/forms/{form['form_id']}/submissions/count", headers=auth_headers, params={"q": "billing"}
    )
    assert count_search_resp.json()["total"] == 1

    update_resp = await client.patch(
        f"/form-submissions/{submission['id']}",
        headers=auth_headers,
        json={"field_values": {"subject": "Broken login - resolved", "notes": "Cannot sign in"}},
    )
    assert update_resp.status_code == 200
    assert update_resp.json()["field_values"]["subject"] == "Broken login - resolved"

    missing_required_resp = await client.patch(
        f"/form-submissions/{submission['id']}",
        headers=auth_headers,
        json={"field_values": {"notes": "no subject"}},
    )
    assert missing_required_resp.status_code == 422

    delete_resp = await client.delete(f"/form-submissions/{submission['id']}", headers=auth_headers)
    assert delete_resp.status_code == 204

    after_delete_resp = await client.get(f"/forms/{form['form_id']}/submissions", headers=auth_headers)
    assert len(after_delete_resp.json()) == 1
    assert after_delete_resp.json()[0]["field_values"]["subject"] == "Billing question"
