#!/usr/bin/env python3
"""Запекает векторные сцены дефолтных фонов (`*.svg`) в WebP для фронтенда.

Исходники сцен — собственные рисунки VidConf (см. README рядом), поэтому
лежат в репозитории вместе с результатом: чужих фотографий с их лицензиями в
продукте нет.

Запуск (нужен установленный Google Chrome и Pillow):

    python3 design/backgrounds/render.py

Результат — `frontend/public/backgrounds/*.webp`, 1280×720. Chrome нужен
только для растеризации SVG (rsvg/ImageMagick на машине может не быть),
Pillow — для перевода PNG в WebP: браузерный скриншот WebP не отдаёт.
"""

import subprocess
import sys
import tempfile
from pathlib import Path

from PIL import Image

CHROME = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
WIDTH, HEIGHT = 1280, 720
# 82 — визуально неотличимо от исходника на плавных градиентах сцены, а вес
# втрое меньше, чем при 95. Фон грузится по сети при каждом первом показе.
WEBP_QUALITY = 82

SOURCE_DIR = Path(__file__).parent
TARGET_DIR = SOURCE_DIR.parents[1] / "frontend" / "public" / "backgrounds"


def render(svg_path: Path, out_path: Path, workdir: Path) -> None:
    """Растеризовать одну сцену и сохранить её в WebP."""
    png_path = workdir / f"{svg_path.stem}.png"
    subprocess.run(
        [
            CHROME,
            "--headless",
            "--disable-gpu",
            "--hide-scrollbars",
            "--default-background-color=00000000",
            f"--screenshot={png_path}",
            f"--window-size={WIDTH},{HEIGHT}",
            svg_path.resolve().as_uri(),
        ],
        check=True,
        capture_output=True,
    )
    with Image.open(png_path) as image:
        image.convert("RGB").save(out_path, "WEBP", quality=WEBP_QUALITY, method=6)


def main() -> int:
    if not Path(CHROME).exists():
        print(f"не найден Chrome: {CHROME}", file=sys.stderr)
        return 1
    TARGET_DIR.mkdir(parents=True, exist_ok=True)
    with tempfile.TemporaryDirectory() as tmp:
        workdir = Path(tmp)
        for svg_path in sorted(SOURCE_DIR.glob("*.svg")):
            out_path = TARGET_DIR / f"{svg_path.stem}.webp"
            render(svg_path, out_path, workdir)
            print(
                f"{svg_path.name} → {out_path.relative_to(SOURCE_DIR.parents[1])}"
                f" ({out_path.stat().st_size // 1024} КБ)"
            )
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
