#!/usr/bin/env python3
"""Playwright 截屏入口（薄壳，逻辑在 _media_screenshot 包）。"""
from __future__ import annotations

import argparse
import os
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent))
from _media_screenshot import cli_args, do_screenshot  # noqa: E402


def main() -> None:
    ap = argparse.ArgumentParser(
        description="通过 Playwright 对网页进行截屏，仅落盘到本地路径。"
    )
    ap.add_argument("-u", "--url", required=True, help="待截屏的页面 URL")
    ap.add_argument(
        "-o", "--output", default="screenshot.png",
        help="本地输出路径（默认 screenshot.png）",
    )
    ap.add_argument("--full-page", action="store_true", help="整页截屏")
    ap.add_argument("--selector", help='截某个 CSS 元素本身（如 ".card"）')
    ap.add_argument(
        "--clip",
        help='区域截屏 "x,y,w,h"（像素）。与 --selector 同设时以元素 boundingBox 为基点偏移。',
    )
    ap.add_argument(
        "--no-scroll-into-view", action="store_true",
        help="--selector 模式下关闭自动滚动",
    )
    ap.add_argument(
        "--hide-selector", action="append", default=[],
        help='截屏前 display:none 该 CSS 选择器（隐藏 cookie banner、登录浮层等）。可重复。',
    )
    ap.add_argument(
        "--mask-selector", action="append", default=[],
        help='截屏时用 Playwright 原生 mask 涂盖该 CSS 选择器（默认粉色块）。可重复。',
    )
    ap.add_argument(
        "--mask-color",
        help='--mask-selector 的填充色（如 "#000" / "rgba(0,0,0,0.9)"），默认 Playwright 粉色。',
    )
    ap.add_argument(
        "--annotate",
        help='注释 JSON 文件或字符串：在截屏前用 storyboard 场景（highlight/arrow/caption/title-card/sequence/redact 等）画注解。'
        ' 顶层可为数组或 {"annotations": [...], "settleMs": 900}。',
    )
    cli_args.add_common_args(ap)

    args = ap.parse_args()

    # 截屏只出图片。若 --output 是视频后缀，Playwright 的 page.screenshot() 会按扩展名
    # 推断出 video/webm 并抛一串晦涩的 mime 错误。这里提前拦截，返回面向模型的清晰指引，
    # 把请求导向 web_record（录屏入口）。
    video_exts = (".webm", ".mp4", ".mov", ".mkv", ".avi", ".gif")
    if args.output.lower().endswith(video_exts):
        ext = Path(args.output).suffix or "(video)"
        print(
            f"截屏入口只输出静态图片（.png/.jpg），不能生成 {ext} 视频。"
            "请改用 web_record 工具录屏（固定时长 / 自动滚动 / storyboard），"
            "或把 --output 换成 .png / .jpg 后缀。",
            file=sys.stderr,
        )
        sys.exit(2)

    storage_path, is_temp = cli_args.build_storage(args)

    cfg: dict = {
        "url": args.url,
        "output": str(Path(args.output).resolve()),
        "browser": args.browser or "chromium",
        "fullPage": bool(args.full_page),
        "scrollIntoView": not args.no_scroll_into_view,
    }
    cli_args.common_args_to_cfg(args, cfg)
    if storage_path:
        cfg["storageState"] = storage_path
    if args.selector:
        cfg["selector"] = args.selector
    if args.clip:
        cfg["clip"] = cli_args.parse_clip(args.clip)
    if args.hide_selector:
        cfg["hideSelectors"] = list(args.hide_selector)
    if args.mask_selector:
        cfg["maskSelectors"] = list(args.mask_selector)
    if args.mask_color:
        cfg["maskColor"] = args.mask_color
    if args.annotate:
        cfg["annotate"] = args.annotate

    try:
        out = do_screenshot(cfg)
    finally:
        if is_temp and storage_path:
            try:
                os.unlink(storage_path)
            except OSError:
                pass

    if not out.exists():
        print(f"截屏未生成：{out}", file=sys.stderr)
        sys.exit(1)
    print(str(out))


if __name__ == "__main__":
    main()
