# retoor <retoor@molodetz.nl>

import requests
from playwright.sync_api import expect
from tests.conftest import BASE_URL
from devplacepy.database import get_table

USER_INPUT = '#cm-admin-create-form input[data-search="user"]'
USER_OPTIONS = '#cm-admin-create-form [data-suggest="user"] li[data-value]'
RUN_AS_HIDDEN = '#cm-admin-create-form input[name="run_as_uid"]'


def _open_user_search(page):
    page.goto(f"{BASE_URL}/admin/containers", wait_until="domcontentloaded")
    page.click('[data-modal="cm-admin-create-modal"]')
    inp = page.locator(USER_INPUT)
    inp.wait_for(state="visible")
    inp.fill("test")
    options = page.locator(USER_OPTIONS)
    options.first.wait_for(state="visible")
    return inp, options


def test_containers_admin_page_loads(alice, app_server):
    page, user = alice
    page.goto(f"{BASE_URL}/admin/containers", wait_until="domcontentloaded")
    assert page.is_visible(".admin-toolbar h2:has-text('Containers')")


def test_container_instance_page_404_for_missing(alice, app_server):
    page, _ = alice
    page.goto(f"{BASE_URL}/admin/containers/nonexistent", wait_until="domcontentloaded")
    assert page.is_visible("text=Not Found") or page.is_visible("text=404")


def test_user_search_arrow_keys_highlight_and_enter_selects(alice, seeded_db):
    page, _ = alice
    inp, options = _open_user_search(page)
    count = options.count()
    assert count >= 1

    inp.press("ArrowDown")
    expect(options.nth(0)).to_have_class("cm-suggest-active")

    target = options.nth(0)
    if count >= 2:
        inp.press("ArrowDown")
        expect(options.nth(1)).to_have_class("cm-suggest-active")
        expect(options.nth(0)).not_to_have_class("cm-suggest-active")
        target = options.nth(1)

    label = target.get_attribute("data-label")
    inp.press("Enter")

    expect(page.locator(USER_OPTIONS)).to_have_count(0)
    assert inp.input_value() == label
    assert page.locator(RUN_AS_HIDDEN).input_value() != ""


def test_user_search_arrow_up_wraps_to_last(alice, seeded_db):
    page, _ = alice
    inp, options = _open_user_search(page)
    if options.count() < 2:
        return
    last = options.count() - 1
    inp.press("ArrowUp")
    expect(options.nth(last)).to_have_class("cm-suggest-active")


def test_user_search_tab_navigates_options(alice, seeded_db):
    page, _ = alice
    inp, options = _open_user_search(page)
    inp.press("Tab")
    expect(options.nth(0)).to_have_class("cm-suggest-active")
    if options.count() >= 2:
        inp.press("Tab")
        expect(options.nth(1)).to_have_class("cm-suggest-active")


def test_user_search_tab_past_last_selects_and_releases(alice, seeded_db):
    page, _ = alice
    inp, options = _open_user_search(page)
    count = options.count()
    label = options.nth(count - 1).get_attribute("data-label")
    for _ in range(count + 1):
        inp.press("Tab")

    expect(page.locator(USER_OPTIONS)).to_have_count(0)
    assert inp.input_value() == label
    assert page.locator(RUN_AS_HIDDEN).input_value() != ""
    assert not inp.evaluate("el => el === document.activeElement")


def test_user_search_escape_closes_without_selecting(alice, seeded_db):
    page, _ = alice
    inp, _ = _open_user_search(page)
    inp.press("Escape")
    expect(page.locator(USER_OPTIONS)).to_have_count(0)
    assert page.locator(RUN_AS_HIDDEN).input_value() == ""


def test_user_search_has_combobox_aria(alice, seeded_db):
    page, _ = alice
    inp, options = _open_user_search(page)
    assert inp.get_attribute("role") == "combobox"
    assert inp.get_attribute("aria-expanded") == "true"
    inp.press("ArrowDown")
    active = inp.get_attribute("aria-activedescendant")
    assert active
    assert options.nth(0).get_attribute("id") == active
