#!/usr/bin/env python3
"""Batch A 프로덕션 배너 통합 렌더러 — Playwright"""

from playwright.sync_api import sync_playwright
from pathlib import Path

BASE = "/home/jay/workspace/output/meta-ads/production-banners/batch-a"

BANNER_CONFIGS = [
    {
        "html_path": f"{BASE}/09-minimal-typography/09-minimal-1200x628.html",
        "output_path": f"{BASE}/09-minimal-typography/09-minimal-1200x628.png",
        "width": 1200,
        "height": 628,
    },
    {
        "html_path": f"{BASE}/09-minimal-typography/09-minimal-1200x1200.html",
        "output_path": f"{BASE}/09-minimal-typography/09-minimal-1200x1200.png",
        "width": 1200,
        "height": 1200,
    },
    {
        "html_path": f"{BASE}/15-cjk-typography/15-cjk-1200x628.html",
        "output_path": f"{BASE}/15-cjk-typography/15-cjk-1200x628.png",
        "width": 1200,
        "height": 628,
    },
    {
        "html_path": f"{BASE}/15-cjk-typography/15-cjk-1200x1200.html",
        "output_path": f"{BASE}/15-cjk-typography/15-cjk-1200x1200.png",
        "width": 1200,
        "height": 1200,
    },
    {
        "html_path": f"{BASE}/17-number-newsflash/17-newsflash-1200x628.html",
        "output_path": f"{BASE}/17-number-newsflash/17-newsflash-1200x628.png",
        "width": 1200,
        "height": 628,
    },
    {
        "html_path": f"{BASE}/17-number-newsflash/17-newsflash-1200x1200.html",
        "output_path": f"{BASE}/17-number-newsflash/17-newsflash-1200x1200.png",
        "width": 1200,
        "height": 1200,
    },
    {
        "html_path": f"{BASE}/23-nike-style/23-nike-1200x628.html",
        "output_path": f"{BASE}/23-nike-style/23-nike-1200x628.png",
        "width": 1200,
        "height": 628,
    },
    {
        "html_path": f"{BASE}/23-nike-style/23-nike-1200x1200.html",
        "output_path": f"{BASE}/23-nike-style/23-nike-1200x1200.png",
        "width": 1200,
        "height": 1200,
    },
    {
        "html_path": f"{BASE}/25-mcdonalds-style/25-mcdonalds-1200x628.html",
        "output_path": f"{BASE}/25-mcdonalds-style/25-mcdonalds-1200x628.png",
        "width": 1200,
        "height": 628,
    },
    {
        "html_path": f"{BASE}/25-mcdonalds-style/25-mcdonalds-1200x1200.html",
        "output_path": f"{BASE}/25-mcdonalds-style/25-mcdonalds-1200x1200.png",
        "width": 1200,
        "height": 1200,
    },
]


def render_banner(page, config):
    html_path = Path(config["html_path"])
    output_path = Path(config["output_path"])
    w, h = config["width"], config["height"]

    assert html_path.exists(), f"HTML 없음: {html_path}"

    page.set_viewport_size({"width": w, "height": h})
    page.goto(f"file://{html_path.resolve()}", wait_until="networkidle")

    # 폰트 로딩 대기
    page.evaluate("async () => { await document.fonts.ready; }")
    page.wait_for_timeout(2000)

    output_path.parent.mkdir(parents=True, exist_ok=True)
    page.screenshot(
        path=str(output_path),
        type="png",
        clip={"x": 0, "y": 0, "width": w, "height": h},
    )

    size_kb = output_path.stat().st_size / 1024
    return size_kb


def main():
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()

        results = []
        for config in BANNER_CONFIGS:
            try:
                size_kb = render_banner(page, config)
                results.append({"path": config["output_path"], "size_kb": size_kb, "status": "OK"})
                print(f"[OK] {Path(config['output_path']).name} ({size_kb:.0f} KB)")
            except Exception as e:
                results.append({"path": config["output_path"], "size_kb": 0, "status": f"FAIL: {e}"})
                print(f"[FAIL] {Path(config['output_path']).name}: {e}")

        browser.close()

    # 결과 요약
    ok = sum(1 for r in results if r["status"] == "OK")
    print(f"\n=== 결과: {ok}/{len(results)} 성공 ===")
    for r in results:
        print(f"  {Path(r['path']).name}: {r['status']} ({r['size_kb']:.0f} KB)")


if __name__ == "__main__":
    main()
