"""Zoom scene: element-level OR page-level (browser-like) zoom animation."""
from __future__ import annotations

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


def _run_page_zoom(page, scene: dict) -> None:
    target_scale = scene.get("scale", 2.5)
    ramp_in_ms = scene.get("rampInMs", scene.get("rampMs", 700))
    ramp_out_ms = scene.get("rampOutMs", 0)
    hold_ms = scene.get("holdMs", 2500)
    color = scene.get("color", "#ff9500")
    label = scene.get("label", "")
    page.evaluate(
        js_loader.load("page_zoom_in"),
        {
            "selector": scene["selector"],
            "targetScale": target_scale,
            "rampInMs": ramp_in_ms,
            "label": label,
            "color": color,
        },
    )
    page.wait_for_timeout(ramp_in_ms + hold_ms)
    if ramp_out_ms > 0:
        page.evaluate(js_loader.load("page_zoom_out"), {"rampOutMs": ramp_out_ms})
        page.wait_for_timeout(ramp_out_ms + 100)
    page.evaluate(js_loader.load("page_zoom_restore"))


def _run_element_zoom(page, scene: dict) -> None:
    target_scale = scene.get("scale", 2.5)
    ramp_ms = scene.get("rampMs", 700)
    hold_ms = scene.get("holdMs", 2500)
    color = scene.get("color", "#ff9500")
    label = scene.get("label", "")
    dim = scene.get("dim", True)
    line_width = scene.get("lineWidth", 3)

    page.evaluate(
        js_loader.load("element_zoom"),
        {
            "selector": scene["selector"],
            "targetScale": target_scale,
            "rampMs": ramp_ms,
            "color": color,
            "label": label,
            "dim": dim,
            "lineWidth": line_width,
        },
    )
    page.wait_for_timeout(ramp_ms + hold_ms)
    page.evaluate(js_loader.load("element_zoom_restore"), scene["selector"])


@register("zoom")
def scene_zoom(page, scene: dict) -> None:
    target = scene.get("target", "element")
    locator = resolve_locator(page, scene["selector"])
    locator.scroll_into_view_if_needed()
    # Center in viewport so the element has room to grow.
    locator.evaluate(
        "el => el.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' })"
    )
    page.wait_for_timeout(250)

    if target == "page":
        _run_page_zoom(page, scene)
    else:
        _run_element_zoom(page, scene)
