"""
bake-slide-01.py — Rendert Slide 1 (Cover A · Photo + Overlay) aus
preview.html als gebackenes 2160 x 2700 PNG (2x Pixeldichte für
LinkedIn-Schärfe). Konvertiert anschließend zu JPEG quality 92.

Hintergrund: LinkedIn macht serverseitig aus PDF-Pages eigene Bitmaps.
Multi-Layer-Compositing auf Slide 1 (Foto + Verlauf-Overlay + Headline-Text
+ Counter) wird dabei manchmal falsch geflattent — dunkler Streifen über
dem Gesicht, Verlauf am unteren Rand verschwindet. Lösung: Slide 1 einmal
lokal zu einem fertigen Bitmap backen, das im preview.html nur noch als
<img> sitzt. LinkedIn bekommt dann ein einziges Bild ohne weitere
Compositing-Schritte.

Pre-Render-Spezifikationen (Bundle-Pflicht aus SKILL.md):
- Logische Slide-Größe: 1080 x 1350 px
- device_scale_factor: 2.0
- Backed-Pixel: 2160 x 2700 px
- JPEG quality 92, optimize=True, progressive=True

Aufruf aus dem carousel-Ordner:
    python bake-slide-01.py

Output: slide-01.png (2160 x 2700) und slide-01.jpg (komprimiert).
"""

from __future__ import annotations

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

from playwright.sync_api import sync_playwright


# Logische Slide-Größe (Pflicht aus SKILL.md).
LOGICAL_W = 1080
LOGICAL_H = 1350
# Cover-A-Pre-Render-Settings (Pflicht aus SKILL.md).
DEVICE_SCALE_FACTOR = 2.0
JPEG_QUALITY = 92


def bake() -> int:
    script_dir = Path(__file__).parent
    html_path = (script_dir / "preview.html").resolve()
    png_path = (script_dir / "slide-01.png").resolve()
    jpg_path = (script_dir / "slide-01.jpg").resolve()

    if not html_path.exists():
        print(f"preview.html nicht gefunden in {script_dir}", file=sys.stderr)
        return 2

    file_url = "file:///" + quote(str(html_path).replace("\\", "/"))
    print(f"Rendere Slide 1 -> {png_path.name} ({LOGICAL_W * 2} x {LOGICAL_H * 2})")

    t0 = time.time()
    with sync_playwright() as p:
        browser = p.chromium.launch()
        context = browser.new_context(
            viewport={"width": LOGICAL_W, "height": LOGICAL_H},
            device_scale_factor=DEVICE_SCALE_FACTOR,
        )
        page = context.new_page()
        page.goto(file_url, wait_until="networkidle")
        page.evaluate("document.fonts.ready")
        page.wait_for_timeout(1500)
        page.locator("#slide-01").screenshot(path=str(png_path), type="png")
        browser.close()

    size_kb = png_path.stat().st_size / 1024
    print(f"PNG fertig in {time.time() - t0:.1f}s. PNG: {png_path}")
    print(f"PNG-Größe: {size_kb:.1f} KB")

    # Konvertierung zu JPEG für kleinere Datei und konsistentes LinkedIn-Rendering.
    try:
        from PIL import Image
    except ImportError:
        print(
            "Pillow nicht installiert — JPEG-Konvertierung übersprungen. "
            "Installiere mit: pip install pillow",
            file=sys.stderr,
        )
        return 0

    Image.open(png_path).convert("RGB").save(
        jpg_path,
        "JPEG",
        quality=JPEG_QUALITY,
        optimize=True,
        progressive=True,
    )
    jpg_kb = jpg_path.stat().st_size / 1024
    print(f"JPEG (quality {JPEG_QUALITY}): {jpg_path}")
    print(f"JPEG-Größe: {jpg_kb:.1f} KB")
    return 0


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