# retoor <retoor@molodetz.nl>

import pytest

from devplacepy.database import get_table
from devplacepy.routers.workspaces import index_entries

OWNER = "wsidx-owner"
STRANGER = "wsidx-stranger"
PUBLIC_PROJECT = "wsidx-public"
PRIVATE_PROJECT = "wsidx-private"

ROWS = [
    {
        "uid": "wsidx-instance-public",
        "project_uid": PUBLIC_PROJECT,
        "owner_uid": OWNER,
        "ingress_slug": "wsidx-pub",
        "name": "Public workspace",
    },
    {
        "uid": "wsidx-instance-private",
        "project_uid": PRIVATE_PROJECT,
        "owner_uid": OWNER,
        "ingress_slug": "wsidx-priv",
        "name": "Private workspace",
    },
]


@pytest.fixture
def seeded_workspaces(local_db):
    users = get_table("users")
    projects = get_table("projects")
    users.insert({"uid": OWNER, "username": "wsidx_owner", "role": "Member"})
    users.insert({"uid": STRANGER, "username": "wsidx_stranger", "role": "Member"})
    projects.insert(
        {
            "deleted_at": None,
            "deleted_by": None,
            "uid": PUBLIC_PROJECT,
            "user_uid": OWNER,
            "slug": "wsidx-public-project",
            "title": "Public workspace project",
            "description": "The public project description.",
            "is_private": 0,
        }
    )
    projects.insert(
        {
            "deleted_at": None,
            "deleted_by": None,
            "uid": PRIVATE_PROJECT,
            "user_uid": OWNER,
            "slug": "wsidx-private-project",
            "title": "Private workspace project",
            "description": "The private project description.",
            "is_private": 1,
        }
    )
    yield
    projects.delete(uid=PUBLIC_PROJECT)
    projects.delete(uid=PRIVATE_PROJECT)
    users.delete(uid=OWNER)
    users.delete(uid=STRANGER)


def _by_slug(entries):
    return {entry["slug"]: entry for entry in entries}


def test_every_row_carries_its_uid_and_owner_uid(seeded_workspaces):
    entries = _by_slug(index_entries(ROWS, None))
    assert entries["wsidx-pub"]["uid"] == "wsidx-instance-public"
    assert entries["wsidx-priv"]["uid"] == "wsidx-instance-private"
    for entry in entries.values():
        assert entry["owner_uid"] == OWNER


def test_a_guest_never_sees_a_private_projects_description_or_url(seeded_workspaces):
    entries = _by_slug(index_entries(ROWS, None))
    assert entries["wsidx-pub"]["description"] == "The public project description."
    assert entries["wsidx-pub"]["project_url"] == "/projects/wsidx-public-project"
    assert entries["wsidx-priv"]["description"] == ""
    assert entries["wsidx-priv"]["project_url"] == ""


def test_a_stranger_is_treated_exactly_like_a_guest(seeded_workspaces):
    viewer = {"uid": STRANGER, "username": "wsidx_stranger", "role": "Member"}
    entries = _by_slug(index_entries(ROWS, viewer))
    assert entries["wsidx-priv"]["description"] == ""
    assert entries["wsidx-priv"]["project_url"] == ""


def test_the_project_owner_still_sees_their_private_project_fields(seeded_workspaces):
    viewer = {"uid": OWNER, "username": "wsidx_owner", "role": "Member"}
    entries = _by_slug(index_entries(ROWS, viewer))
    assert entries["wsidx-priv"]["description"] == "The private project description."
    assert entries["wsidx-priv"]["project_url"] == "/projects/wsidx-private-project"


def test_a_published_workspace_is_always_listed_with_its_link(seeded_workspaces):
    entries = _by_slug(index_entries(ROWS, None))
    assert len(entries) == 2
    assert entries["wsidx-priv"]["name"] == "Private workspace"
    assert entries["wsidx-priv"]["url"].endswith("/p/wsidx-priv")
    assert entries["wsidx-priv"]["owner"] == "wsidx_owner"
    assert entries["wsidx-priv"]["maturity"] == "general"
