"""Tenant themes: brand color, font and radius, saved by a settings editor
and read back by everyone in the tenant through GET /tenants/me."""

from tests.test_enterprise_access import _person


def _set(theme: dict) -> dict:
    """The theme's set values (every field is optional)."""
    return {k: v for k, v in theme.items() if v is not None}


async def test_theme_round_trip(client, auth_headers, test_tenant):
    assert _set((await client.get("/tenants/me", headers=auth_headers)).json()["theme"]) == {}
    saved = await client.patch("/tenants/me/theme", headers=auth_headers, json={"brand_color": "#0F766E", "font": "serif", "radius": "large"})
    assert saved.status_code == 200, saved.text
    viewer = await _person(test_tenant["tenant_id"], "Viewer", matrix={})
    assert _set((await client.get("/tenants/me", headers=viewer["headers"])).json()["theme"]) == {"brand_color": "#0F766E", "font": "serif", "radius": "large"}
    # Only settings editors can change it; values are checked.
    assert (await client.patch("/tenants/me/theme", headers=viewer["headers"], json={"font": "mono"})).status_code == 403
    assert (await client.patch("/tenants/me/theme", headers=auth_headers, json={"brand_color": "teal"})).status_code == 422
    assert (await client.patch("/tenants/me/theme", headers=auth_headers, json={"radius": "huge"})).status_code == 422
    # A full replace: omitted fields go back to the defaults.
    reset = await client.patch("/tenants/me/theme", headers=auth_headers, json={})
    assert _set(reset.json()["theme"]) == {}
    # The Portal's control colors ride along, checked the same way.
    portal = await client.patch("/tenants/me/theme", headers=auth_headers, json={"label_color": "#334155", "input_border_color": "#94a3b8"})
    assert _set(portal.json()["theme"]) == {"label_color": "#334155", "input_border_color": "#94a3b8"}
    assert (await client.patch("/tenants/me/theme", headers=auth_headers, json={"label_color": "slate"})).status_code == 422
