"""
print-to-pdf.py — Rendert eine Warm-Navigator-Praesentation per Headless-Chrome
in ein randloses PDF mit exakter Slide-Größe (Default 1920x1080).

Nutzt Playwright. Keine Druckdialog-Pfusch, kein Background-Graphics-Toggle,
keine A4-Letterbox-Streifen. PDF hat genau das Slide-Format.

Aufruf:
    python print-to-pdf.py <pfad-zur-html>
    python print-to-pdf.py <pfad-zur-html> -o <ziel.pdf>
    python print-to-pdf.py <pfad-zur-html> --width 1920 --height 1080

Default-Output: gleiche Datei mit .pdf statt .html, liegt direkt daneben.
"""

# --- Bundle-Pflicht-Sätze §1 (Wave I v0.17.0, Phase A) ---
# Pfad-Resolver-Standard (analog _cross_skill_evals/run_linkedin_wave_h_evals.py):
#   BUNDLE_ROOT = Path(__file__).resolve().parent.parent.parent.parent
#     # .skills/neue-praesentation/scripts/file.py -> Repo-Root
#   SKILL_ROOT = BUNDLE_ROOT / ".skills" / "neue-praesentation"
#   FOUNDATION = BUNDLE_ROOT / "_lib" / "designsystem" / "templates" / "praesentation"
# Echte Umlaute (ä ö ü ß) durchgehend, keine ae/oe/ue/ss-Substitutionen.


import argparse
import sys
import time
from pathlib import Path
from urllib.parse import quote

from playwright.sync_api import sync_playwright


def render_pdf(html_path: Path, pdf_path: Path, width: int, height: int, wait_ms: int) -> None:
    file_url = "file:///" + quote(str(html_path.resolve()).replace("\\", "/"))

    with sync_playwright() as p:
        browser = p.chromium.launch()
        context = browser.new_context(viewport={"width": width, "height": height})
        page = context.new_page()
        page.goto(file_url, wait_until="networkidle")

        # Warten bis React gerendert hat und Bilder geladen sind.
        # networkidle deckt das meiste, aber Stagger-Animationen + Bild-Decode
        # brauchen noch einen Moment. Default 1500ms, überschreibbar via --wait.
        page.wait_for_timeout(wait_ms)

        page.pdf(
            path=str(pdf_path),
            width=f"{width}px",
            height=f"{height}px",
            margin={"top": "0", "bottom": "0", "left": "0", "right": "0"},
            print_background=True,
            prefer_css_page_size=False,
        )

        browser.close()


def main() -> int:
    parser = argparse.ArgumentParser(description="Praesentation als randloses PDF rendern.")
    parser.add_argument("html", help="Pfad zur HTML-Datei der Praesentation")
    parser.add_argument("-o", "--output", help="Ziel-PDF (Default: <html>.pdf daneben)")
    parser.add_argument("--width", type=int, default=1920, help="Slide-Breite in Pixel (Default 1920)")
    parser.add_argument("--height", type=int, default=1080, help="Slide-Hoehe in Pixel (Default 1080)")
    parser.add_argument("--wait", type=int, default=1500, help="Wartezeit nach Load in ms (Default 1500)")
    args = parser.parse_args()

    html_path = Path(args.html).resolve()
    if not html_path.exists():
        print(f"Datei nicht gefunden: {html_path}", file=sys.stderr)
        return 2
    if html_path.suffix.lower() != ".html":
        print(f"Erwartet eine .html-Datei, bekommen: {html_path.suffix}", file=sys.stderr)
        return 2

    pdf_path = Path(args.output).resolve() if args.output else html_path.with_suffix(".pdf")

    print(f"Rendere {html_path.name} -> {pdf_path.name} ({args.width}x{args.height})")
    t0 = time.time()
    render_pdf(html_path, pdf_path, args.width, args.height, args.wait)
    print(f"Fertig in {time.time() - t0:.1f}s. PDF liegt in: {pdf_path}")
    return 0


if __name__ == "__main__":
    sys.exit(main())
