"""A portal role's default landing can be a Page (default_page_id) or a
Dashboard (action_matrix["default_dashboard"], surfaced as default_dashboard_id)
— never both, and only one the role is itself granted."""

import uuid


async def _create_portal_role(client, headers, matrix, **extra):
    return await client.post("/roles", headers=headers, json={"name": f"Landing {uuid.uuid4().hex[:6]}", "scope": "portal", "action_matrix": matrix, **extra})


async def test_dashboard_landing_round_trips(client, auth_headers):
    dash = str(uuid.uuid4())
    resp = await _create_portal_role(client, auth_headers, {"dashboard": [dash], "default_dashboard": [dash]})
    assert resp.status_code == 201, resp.text
    body = resp.json()
    assert body["default_dashboard_id"] == dash
    assert body["default_page_id"] is None

    # clearing it on update drops the id again
    cleared = await client.patch(f"/roles/{body['id']}", headers=auth_headers, json={"action_matrix": {"dashboard": [dash]}, "default_page_id": None})
    assert cleared.status_code == 200, cleared.text
    assert cleared.json()["default_dashboard_id"] is None


async def test_dashboard_landing_must_be_granted(client, auth_headers):
    resp = await _create_portal_role(client, auth_headers, {"dashboard": [str(uuid.uuid4())], "default_dashboard": [str(uuid.uuid4())]})
    assert resp.status_code == 422


async def test_page_and_dashboard_landing_are_exclusive(client, auth_headers):
    dash, page = str(uuid.uuid4()), str(uuid.uuid4())
    resp = await _create_portal_role(
        client, auth_headers, {"dashboard": [dash], "pages": [page], "default_dashboard": [dash]}, default_page_id=page
    )
    assert resp.status_code == 422


async def test_internal_role_cannot_have_a_landing(client, auth_headers):
    dash = str(uuid.uuid4())
    resp = await client.post(
        "/roles", headers=auth_headers, json={"name": "Internal Landing", "scope": "internal", "action_matrix": {"dashboard": [dash], "default_dashboard": [dash]}}
    )
    assert resp.status_code == 422
