"""Click scene: animated cursor flies to target, ripple, then optional real click."""
from __future__ import annotations

from .. import js_loader
from ..browser import resolve_locator
from . import register


@register("click")
def scene_click(page, scene: dict) -> None:
    locator = resolve_locator(page, scene["selector"])
    box = locator.bounding_box()
    if not box:
        raise RuntimeError(f"click: no bounding box for {scene['selector']}")
    cx = box["x"] + box["width"] / 2
    cy = box["y"] + box["height"] / 2

    move_ms = int(scene.get("moveMs", 700))
    pre_hold = int(scene.get("preHoldMs", 150))
    post_hold = int(scene.get("postHoldMs", 800))
    ripple_ms = int(scene.get("rippleMs", 550))
    color = scene.get("color", "#ff3b30")

    page.evaluate(js_loader.load("cursor_bootstrap"))
    page.evaluate(js_loader.load("cursor_move"), {"x": cx, "y": cy, "ms": move_ms})
    page.wait_for_timeout(move_ms + pre_hold)
    page.evaluate(js_loader.load("cursor_ripple"), {"color": color, "ms": ripple_ms})

    if scene.get("realClick", True):
        try:
            locator.evaluate("el => el.click()")
        except Exception:
            pass

    page.wait_for_timeout(post_hold)
