# retoor <retoor@molodetz.nl>

from playwright.sync_api import expect
from tests.e2e.post import create_post


def _post_comment(page, body):
    textarea = page.locator(".comment-form textarea[name='content']")
    textarea.fill(body)
    page.locator(".comment-form button:has-text('Post')").click()
    comment = page.locator(f".comment-text:has-text('{body}')")
    expect(comment).to_be_visible()
    return comment


def _delete_comment(page, body):
    wrapper = page.locator(f".comment:has(.comment-text:has-text('{body}'))").last
    wrapper.locator(".comment-action-btn:has-text('Delete')").click()
    page.locator(".dialog-overlay.visible .dialog-confirm").click()


def test_delete_comment_removes_it(alice):
    page, _ = alice
    create_post(page, "fun", "Post for delete scroll removal")
    comment = _post_comment(page, "Comment that will be deleted")
    _delete_comment(page, "Comment that will be deleted")
    expect(comment).to_have_count(0)


def test_delete_comment_scrolls_to_previous_comment(alice):
    page, _ = alice
    create_post(page, "devlog", "Post for delete scroll anchor")
    for index in range(6):
        _post_comment(page, f"Scroll anchor comment {index}")

    target = "Scroll anchor comment 5"
    previous = "Scroll anchor comment 4"
    previous_wrapper = page.locator(
        f".comment:has(.comment-text:has-text('{previous}'))"
    ).last
    anchor_top = previous_wrapper.evaluate(
        "el => el.getBoundingClientRect().top + window.scrollY"
    )

    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
    _delete_comment(page, target)
    expect(page.locator(f".comment-text:has-text('{target}')")).to_have_count(0)

    page.wait_for_function(
        "expected => { const max = document.documentElement.scrollHeight - window.innerHeight; return Math.abs(window.scrollY - Math.min(expected, max)) < 120; }",
        arg=anchor_top,
    )
    expect(previous_wrapper).to_be_visible()


def test_delete_only_comment_scrolls_without_error(alice):
    page, _ = alice
    create_post(page, "random", "Post for delete only comment")
    _post_comment(page, "Sole comment to delete")
    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
    _delete_comment(page, "Sole comment to delete")
    expect(page.locator(".comment-text:has-text('Sole comment to delete')")).to_have_count(0)
    assert page.evaluate("window.scrollY") >= 0
