# retoor <retoor@molodetz.nl>

from uuid import uuid4
from datetime import datetime, timezone
from tests.conftest import BASE_URL
from devplacepy.database import get_table, refresh_snapshot
from devplacepy.utils import make_combined_slug
def seed_admin_news(count=3):
    news_table = get_table("news")
    news_table.delete()
    for i in range(count):
        eid = f"admin_test_news_{i}"
        if news_table.find_one(external_id=eid):
            continue
        uid = str(uuid4())
        title = f"Admin News Article {i}"
        slug = make_combined_slug(title, uid)
        news_table.insert(
            {
                "deleted_at": None,
                "deleted_by": None,
                "uid": uid,
                "slug": slug,
                "title": title,
                "external_id": eid,
                "grade": 5 + i,
                "status": "draft" if i == 0 else "published",
                "show_on_landing": 1 if i == 1 else 0,
                "source_name": "AdminTest",
                "synced_at": datetime.now(timezone.utc).isoformat(),
                "description": f"Test article {i} for admin tests.",
            }
        )
def seed_extra_users(count=30):
    users = get_table("users")
    existing_count = len(list(users.all()))
    if existing_count > 5:
        return
    for i in range(count):
        uid = str(uuid4())
        users.insert(
            {
                "uid": uid,
                "username": f"pagu_{i:04d}",
                "terms_version": "1",
                "email": f"pagu{i:04d}@test.devplace",
                "password_hash": "x",
                "role": "Member",
                "is_active": True,
                "created_at": datetime.now(timezone.utc).isoformat(),
            }
        )
def _seed_target_user():
    uid = str(uuid4())
    get_table("users").insert(
        {
            "uid": uid,
            "username": f"target_{uid[:8]}",
            "terms_version": "1",
            "email": f"target_{uid[:8]}@test.devplace",
            "password_hash": "x",
            "role": "Member",
            "is_active": True,
            "created_at": datetime.now(timezone.utc).isoformat(),
        }
    )
    return uid


def test_admin_news_loads(alice):
    page, _ = alice
    seed_admin_news()
    page.goto(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    assert page.is_visible("text=News")
    assert page.is_visible("text=Admin News Article")


def test_admin_news_publish_toggle(alice):
    page, _ = alice
    seed_admin_news()
    page.goto(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    toggle_sel = "form[action*='/publish'] button.admin-toggle-switch"
    was_active = "active" in (
        page.locator(toggle_sel).first.get_attribute("class") or ""
    )
    page.locator(toggle_sel).first.click()
    page.wait_for_url(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    is_active = "active" in (
        page.locator(toggle_sel).first.get_attribute("class") or ""
    )
    assert is_active != was_active


def test_admin_news_landing_toggle(alice):
    page, _ = alice
    seed_admin_news()
    page.goto(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    toggle_sel = "form[action*='/landing'] button.admin-toggle-switch"
    was_active = "active" in (
        page.locator(toggle_sel).first.get_attribute("class") or ""
    )
    page.locator(toggle_sel).first.click()
    page.wait_for_url(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    is_active = "active" in (
        page.locator(toggle_sel).first.get_attribute("class") or ""
    )
    assert is_active != was_active
    refresh_snapshot()
    assert get_table("news").count(landing_locked=1) >= 1


def test_admin_news_featured_locks_row(alice):
    page, _ = alice
    seed_admin_news()
    page.goto(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    toggle_sel = "form[action$='/toggle'] button.admin-toggle-switch"
    page.locator(toggle_sel).first.click()
    page.wait_for_url(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    refresh_snapshot()
    assert get_table("news").count(featured_locked=1) >= 1


def test_admin_news_delete(alice):
    page, _ = alice
    seed_admin_news()
    page.goto(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    initial_count = len(page.locator("table tbody tr").all())
    page.locator("form[action*='/delete'] button").first.click()
    page.locator(".dialog-overlay.visible .dialog-confirm").click()
    page.wait_for_url(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    page.wait_for_timeout(1000)
    new_count = len(page.locator("table tbody tr").all())
    assert new_count < initial_count


def test_admin_news_pagination(alice):
    page, _ = alice
    seed_admin_news(30)
    page.goto(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    assert page.text_content(".pagination-info") is not None
    assert "Page 1" in page.text_content(".pagination-info")
    next_btn = page.locator("a.pagination-btn:has-text('Next')")
    assert next_btn.count() > 0, "30 seeded articles must span more than one page"
    next_btn.first.click()
    page.wait_for_url(f"{BASE_URL}/admin/news?page=2", wait_until="domcontentloaded")
    assert "Page 2" in page.text_content(".pagination-info")


def test_admin_news_featured_toggle(alice):
    page, _ = alice
    seed_admin_news()
    page.goto(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    toggle_sel = "form[action$='/toggle'] button.admin-toggle-switch"
    was_active = "active" in (
        page.locator(toggle_sel).first.get_attribute("class") or ""
    )
    page.locator(toggle_sel).first.click()
    page.wait_for_url(f"{BASE_URL}/admin/news", wait_until="domcontentloaded")
    is_active = "active" in (
        page.locator(toggle_sel).first.get_attribute("class") or ""
    )
    assert is_active != was_active
