#!/usr/bin/env python3
"""M3 FAIL 배너 재렌더링 스크립트 (6장)
수정된 HTML 템플릿으로 기존 배경 이미지를 사용하여 재렌더링합니다.
배경 이미지는 재생성하지 않습니다.
"""

from __future__ import annotations

from pathlib import Path
from playwright.sync_api import sync_playwright
from gen_config import WORKSPACE_ROOT

# ── 경로 설정 ─────────────────────────────────────────────────────────────────
BASE_DIR = Path(__file__).parent
OUTPUT_DIR = WORKSPACE_ROOT / "output/google-ads/banners/m3"
TMP_DIR = BASE_DIR / "output" / "v4-hybrid"

BG_M3_1 = TMP_DIR / "bg_m3_1.jpg"
BG_M3_2 = TMP_DIR / "bg_m3_2.jpg"
BG_M3_3 = TMP_DIR / "bg_m3_3.jpg"


# ── HTML 생성 함수 import ─────────────────────────────────────────────────────
import sys
sys.path.insert(0, str(BASE_DIR))

from gen_m3_1_banners import make_html_1200x628 as m3_1_1200, make_html_1080x1080 as m3_1_1080
from gen_m3_2_banners import make_html_1200x628 as m3_2_1200, make_html_1080x1080 as m3_2_1080
from gen_m3_3_banners import make_html_1200x628 as m3_3_1200, make_html_1080x1080 as m3_3_1080


# ── Playwright 캡처 ───────────────────────────────────────────────────────────

def capture(html: str, out_path: Path, w: int, h: int, tag: str) -> None:
    """HTML 문자열을 Playwright로 PNG 캡처."""
    tmp = TMP_DIR / f"_rerender_{tag}_{w}x{h}.html"
    tmp.write_text(html, encoding="utf-8")
    try:
        with sync_playwright() as p:
            b = p.chromium.launch(args=["--no-sandbox", "--disable-gpu"])
            try:
                pg = b.new_page(viewport={"width": w, "height": h})
                pg.goto(f"file://{tmp.resolve()}", wait_until="networkidle")
                pg.wait_for_timeout(3000)
                out_path.parent.mkdir(parents=True, exist_ok=True)
                pg.screenshot(
                    path=str(out_path),
                    type="png",
                    clip={"x": 0, "y": 0, "width": w, "height": h},
                )
                size_kb = out_path.stat().st_size / 1024
                print(f"  [OK] {out_path.name}  ({size_kb:.0f} KB)")
            finally:
                b.close()
    finally:
        tmp.unlink(missing_ok=True)


# ── 메인 ─────────────────────────────────────────────────────────────────────

def main():
    print("=" * 60)
    print("M3 배너 재렌더링 시작 (6장)")
    print("=" * 60)

    tasks = [
        # (html_func, bg_path, out_filename, width, height, tag)
        (m3_1_1200, BG_M3_1, "m3-1-1200x628.png",  1200,  628, "m3_1"),
        (m3_1_1080, BG_M3_1, "m3-1-1080x1080.png", 1080, 1080, "m3_1"),
        (m3_2_1200, BG_M3_2, "m3-2-1200x628.png",  1200,  628, "m3_2"),
        (m3_2_1080, BG_M3_2, "m3-2-1080x1080.png", 1080, 1080, "m3_2"),
        (m3_3_1200, BG_M3_3, "m3-3-1200x628.png",  1200,  628, "m3_3"),
        (m3_3_1080, BG_M3_3, "m3-3-1080x1080.png", 1080, 1080, "m3_3"),
    ]

    results = []
    for html_func, bg_path, filename, w, h, tag in tasks:
        out_path = OUTPUT_DIR / filename
        print(f"\n[{filename}] 렌더링 중...")
        if not bg_path.exists():
            print(f"  [경고] 배경 이미지 없음: {bg_path}")
            results.append((filename, False, "배경 없음"))
            continue
        try:
            html = html_func(bg_path)
            capture(html, out_path, w, h, tag)
            results.append((filename, True, f"{out_path.stat().st_size/1024:.0f} KB"))
        except Exception as e:
            print(f"  [오류] {e}")
            results.append((filename, False, str(e)))

    print("\n" + "=" * 60)
    print("재렌더링 완료 요약")
    print("=" * 60)
    success = 0
    for fname, ok, info in results:
        status = "SUCCESS" if ok else "FAIL"
        print(f"  [{status}] {fname}  {info}")
        if ok:
            success += 1
    print(f"\n총 {success}/{len(tasks)}장 성공")
    print("출력 경로:", OUTPUT_DIR)


if __name__ == "__main__":
    main()
