#!/usr/bin/env python3
"""Browser regression test for row/column remaining-star guides."""

from __future__ import annotations

import os
import re
from pathlib import Path

from playwright.sync_api import sync_playwright

ROOT = Path(__file__).resolve().parents[1]
CHROMIUM = os.environ.get("CHROMIUM_PATH", "/usr/bin/chromium")

fixture = (ROOT / "tests" / "board-guides-fixture.html").read_text(encoding="utf-8")
css = (ROOT / "public" / "assets" / "board-guides.css").read_text(encoding="utf-8")
js = (ROOT / "public" / "assets" / "board-guides.js").read_text(encoding="utf-8")
fixture = re.sub(
    r'<link\s+rel="stylesheet"\s+href="\.\./public/assets/board-guides\.css">',
    f"<style>{css}</style>",
    fixture,
    flags=re.IGNORECASE,
)
fixture = re.sub(
    r'<script\s+src="\.\./public/assets/board-guides\.js"></script>',
    f"<script>{js}</script>",
    fixture,
    flags=re.IGNORECASE,
)

with sync_playwright() as playwright:
    browser = playwright.chromium.launch(
        executable_path=CHROMIUM,
        headless=True,
        args=["--no-sandbox", "--disable-dev-shm-usage"],
    )
    context = browser.new_context(
        viewport={"width": 390, "height": 844},
        is_mobile=True,
        has_touch=True,
        locale="tr-TR",
    )
    page = context.new_page()
    page_errors: list[str] = []
    console_errors: list[str] = []
    page.on("pageerror", lambda error: page_errors.append(str(error)))
    page.on(
        "console",
        lambda message: console_errors.append(message.text)
        if message.type == "error"
        else None,
    )
    page.set_content(fixture, wait_until="load")
    page.wait_for_selector(".kk-board-layout--game")

    assert page.locator(".kk-board-layout--game .kk-column-guides .kk-guide").count() == 6
    assert page.locator(".kk-board-layout--game .kk-row-guides .kk-guide").count() == 6
    assert page.locator(".kk-board-layout--builder .kk-column-guides .kk-guide").count() == 14
    assert page.locator(".kk-board-layout--builder .kk-row-guides .kk-guide").count() == 14

    game_cell = page.locator("#board .cell").nth(0)
    game_before = game_cell.bounding_box()
    assert game_before
    assert page.locator(".kk-board-layout--game .kk-column-guides .kk-guide").nth(0).inner_text() == "1"
    game_cell.click()
    page.wait_for_timeout(80)
    assert page.locator(".kk-board-layout--game .kk-column-guides .kk-guide").nth(0).inner_text() == "0"
    assert page.locator(".kk-board-layout--game .kk-row-guides .kk-guide").nth(0).inner_text() == "0"
    assert page.locator(".kk-board-layout--game .kk-column-guides .kk-guide").nth(0).get_attribute("data-status") == "complete"

    page.locator("#board .cell").nth(6).click()
    page.wait_for_timeout(80)
    assert page.locator(".kk-board-layout--game .kk-column-guides .kk-guide").nth(0).inner_text() == "−1"
    assert page.locator(".kk-board-layout--game .kk-column-guides .kk-guide").nth(0).get_attribute("data-status") == "over"
    game_after = game_cell.bounding_box()
    assert game_after
    assert abs(game_before["width"] - game_after["width"]) < 0.75
    assert abs(game_before["height"] - game_after["height"]) < 0.75

    builder_cell = page.locator("#builderBoard .builder-cell").nth(0)
    builder_before = builder_cell.bounding_box()
    assert builder_before
    builder_cell.click()
    page.wait_for_timeout(80)
    assert page.locator(".kk-board-layout--builder .kk-column-guides .kk-guide").nth(0).inner_text() == "0"
    assert page.locator(".kk-board-layout--builder .kk-row-guides .kk-guide").nth(0).inner_text() == "0"
    builder_after = builder_cell.bounding_box()
    assert builder_after
    assert abs(builder_before["width"] - builder_after["width"]) < 0.75
    assert abs(builder_before["height"] - builder_after["height"]) < 0.75

    assert not page_errors, page_errors
    assert not console_errors, console_errors
    context.close()
    browser.close()

print("board guides browser regression: PASS")
