"""
print-to-a4-pdf.py - Rendert eine Warm-Navigator-Praesentation per
Headless-Chrome in ein randloses PDF im A4-quer-Aspect (1920x1358 px,
Aspect 1.4143:1 = exakt A4 quer 297mm x 210mm).

Haengt automatisch ?mode=a4 an die file:///-URL, damit die HTML die
A4-Layout-Variante aus theme-a4.css lädt. Die Default-Bildschirm-PDF
wird weiter durch print-to-pdf.py erzeugt - dieser Helper greift nicht
in die Default-Pipeline ein.

Strategie: Viewport == Slide-Layout-Größe (1920x1358). Das vermeidet
Auto-Scale-Letterbox: deck-stage skaliert per transform:scale, was nur
visuell wirkt - das Layout selbst bleibt in seiner natürlichen Größe.
Wenn der Viewport größer als die Slide ist, sitzt die Slide klein in
der Mitte mit Weissraum drumherum (so wie der initiale Bug zeigte).
Die PDF-Aufloesung von 1920x1358 px reicht für Vector-Inhalte (Schrift,
Linien, Logos) bei beliebiger Druckgroesse - PDF ist vektorbasiert.
Für hochauflosende Raster-Inhalte (Bilder) sorgt device_scale_factor=3,
das intern in 5760x4074 rendert und Bilder entsprechend rastert. Beim
Druck skaliert der Drucker oder das PDF-Anzeigeprogramm verlustfrei
auf A4 quer (gleicher Aspect, kein Letterbox).

Aufruf:
    python print-to-a4-pdf.py <pfad-zur-html>
    python print-to-a4-pdf.py <pfad-zur-html> -o <ziel.pdf>
    python print-to-a4-pdf.py <pfad-zur-html> --wait 2000

Default-Output: <slug>-a4.pdf direkt neben der HTML.
"""

# --- 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

# Slide-Layout-Größe im A4-Modus, identisch zu .mode-a4 .slide:
#   1920 / 1.4143 = 1357.85 -> 1358
# Aspect 1920/1358 = 1.4138 (Soll A4: 297/210 = 1.4143, Abweichung 0.04%).
A4_WIDTH_PX = 1920
A4_HEIGHT_PX = 1358

# Hochaufloesende Raster-Bilder: device_scale_factor=3 lasst Chromium
# intern in 5760x4074 rendern - reicht für 300 dpi auf A4 quer
# (3508x2480 = ~2x physikalisch, 3x ist Sicherheitsreserve).
DEVICE_SCALE_FACTOR = 3


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

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

        # Warten bis React/JSX gerendert hat, deck-stage seine Stage skaliert
        # und das zusätzliche theme-a4.css geladen ist. Default 1500 ms.
        page.wait_for_timeout(wait_ms)

        page.pdf(
            path=str(pdf_path),
            width=f"{A4_WIDTH_PX}px",
            height=f"{A4_HEIGHT_PX}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 A4-quer-PDF rendern.")
    parser.add_argument("html", help="Pfad zur HTML-Datei der Praesentation")
    parser.add_argument("-o", "--output", help="Ziel-PDF (Default: <slug>-a4.pdf daneben)")
    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

    if args.output:
        pdf_path = Path(args.output).resolve()
    else:
        pdf_path = html_path.with_name(html_path.stem + "-a4.pdf")

    print(f"Rendere {html_path.name} -> {pdf_path.name} (A4 quer Aspect, {A4_WIDTH_PX}x{A4_HEIGHT_PX} px, dsf {DEVICE_SCALE_FACTOR}x)")
    t0 = time.time()
    render_pdf(html_path, pdf_path, args.wait)
    print(f"Fertig in {time.time() - t0:.1f}s. PDF liegt in: {pdf_path}")
    return 0


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