#!/usr/bin/env python3
"""전체 18장 배너 재렌더링 — Gemini API 호출 없이 기존 배경 + 수정된 HTML/CSS만 Playwright 캡처.

배경 이미지 위치:
  M1: tools/ai-image-gen/output/v4-hybrid/m1-{1,2,3}-*/bg_m1_*.{png,jpg}
  M2: output/google-ads/banners/m2/m2-{1,2,3}-bg.jpg
  M3: tools/ai-image-gen/output/v4-hybrid/bg_m3_{1,2,3}.jpg
"""

from __future__ import annotations

import sys
import time
from pathlib import Path

from playwright.sync_api import sync_playwright
from gen_config import WORKSPACE_ROOT

# ── 경로 설정 ────────────────────────────────────────────────────────────────

TOOL_DIR = WORKSPACE_ROOT / "tools/ai-image-gen"
M2_DIR = WORKSPACE_ROOT / "output/google-ads/banners/m2"
TMP_DIR = TOOL_DIR / "output" / "v4-hybrid"

M1_OUT = WORKSPACE_ROOT / "output/google-ads/banners/m1"
M2_OUT = M2_DIR
M3_OUT = WORKSPACE_ROOT / "output/google-ads/banners/m3"

# sys.path 설정 (모듈 import 전)
sys.path.insert(0, str(TOOL_DIR))
sys.path.insert(0, str(M2_DIR))


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

def capture(html_content: str, output_path: Path, width: int, height: int) -> None:
    """HTML을 Playwright로 캡처하여 PNG 저장."""
    tmp_html = output_path.parent / f"_tmp_{output_path.stem}.html"
    tmp_html.write_text(html_content, encoding="utf-8")

    with sync_playwright() as p:
        browser = p.chromium.launch(args=["--no-sandbox", "--disable-gpu"])
        try:
            page = browser.new_page(viewport={"width": width, "height": height})
            page.goto(f"file://{tmp_html.resolve()}", wait_until="networkidle")
            page.wait_for_timeout(3000)  # 폰트 로딩 대기
            page.screenshot(
                path=str(output_path),
                type="png",
                clip={"x": 0, "y": 0, "width": width, "height": height},
            )
            size_kb = output_path.stat().st_size / 1024
            print(f"  [OK] {output_path.name} ({size_kb:.0f} KB)")
        finally:
            browser.close()

    tmp_html.unlink(missing_ok=True)


# ── 배경 이미지 찾기 ─────────────────────────────────────────────────────────

def find_bg(pattern: str, search_dir: Path) -> Path | None:
    """글로브 패턴으로 배경 이미지를 찾습니다."""
    matches = list(search_dir.glob(pattern))
    if matches:
        return matches[0]
    return None


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

def main() -> None:
    t0 = time.time()
    print("=" * 60)
    print("전체 18장 배너 재렌더링 시작 (배경 재생성 없음)")
    print("=" * 60)

    success = 0
    fail = 0

    # ── M1 배너 (format 방식 템플릿) ─────────────────────────────────────────

    # M1 모듈 import
    from gen_m1_1_fair_banners import HTML_1200x628 as m1_1_w, HTML_1080x1080 as m1_1_s
    from gen_m1_2_leader_banners import HTML_1200x628 as m1_2_w, HTML_1080x1080 as m1_2_s
    from gen_m1_3_support_banners import HTML_1200x628 as m1_3_w, HTML_1080x1080 as m1_3_s

    m1_tasks = [
        ("m1-1", m1_1_w, m1_1_s, "m1-1-fair", "bg_m1_1_fair"),
        ("m1-2", m1_2_w, m1_2_s, "m1-2-leader", "bg_m1_2_leader"),
        ("m1-3", m1_3_w, m1_3_s, "m1-3-support", "bg_m1_3_support"),
    ]

    for name, tmpl_w, tmpl_s, subdir, bg_prefix in m1_tasks:
        bg_dir = TMP_DIR / subdir
        bg = find_bg(f"{bg_prefix}.*", bg_dir)
        if not bg:
            print(f"\n[SKIP] {name}: 배경 이미지 없음 ({bg_dir}/{bg_prefix}.*)")
            fail += 2
            continue

        bg_url = f"file://{bg.resolve()}"
        print(f"\n[{name}] 배경: {bg.name}")

        # 1200x628
        html_w = tmpl_w.format(bg_url=bg_url)
        capture(html_w, M1_OUT / f"{name}-1200x628.png", 1200, 628)
        success += 1

        # 1080x1080
        html_s = tmpl_s.format(bg_url=bg_url)
        capture(html_s, M1_OUT / f"{name}-1080x1080.png", 1080, 1080)
        success += 1

    # ── M2 배너 (f-string 함수 방식) ─────────────────────────────────────────

    from gen_m2_1 import build_html_1200x628 as m2_1_w, build_html_1080x1080 as m2_1_s
    from gen_m2_2 import build_html_1200x628 as m2_2_w, build_html_1080x1080 as m2_2_s
    from gen_m2_3 import build_html_1200x628 as m2_3_w, build_html_1080x1080 as m2_3_s

    m2_tasks = [
        ("m2-1", m2_1_w, m2_1_s, M2_OUT / "m2-1-bg.jpg"),
        ("m2-2", m2_2_w, m2_2_s, M2_OUT / "m2-2-bg.jpg"),
        ("m2-3", m2_3_w, m2_3_s, M2_OUT / "m2-3-bg.jpg"),
    ]

    for name, fn_w, fn_s, bg_path in m2_tasks:
        if not bg_path.exists():
            print(f"\n[SKIP] {name}: 배경 이미지 없음 ({bg_path})")
            fail += 2
            continue

        bg_str = str(bg_path.resolve())
        print(f"\n[{name}] 배경: {bg_path.name}")

        html_w = fn_w(bg_str)
        capture(html_w, M2_OUT / f"{name}-1200x628.png", 1200, 628)
        success += 1

        html_s = fn_s(bg_str)
        capture(html_s, M2_OUT / f"{name}-1080x1080.png", 1080, 1080)
        success += 1

    # ── M3 배너 (f-string 함수 방식) ─────────────────────────────────────────

    from gen_m3_1_banners import make_html_1200x628 as m3_1_w, make_html_1080x1080 as m3_1_s
    from gen_m3_2_banners import make_html_1200x628 as m3_2_w, make_html_1080x1080 as m3_2_s
    from gen_m3_3_banners import make_html_1200x628 as m3_3_w, make_html_1080x1080 as m3_3_s

    m3_bgs = {
        "m3-1": TMP_DIR / "bg_m3_1.jpg",
        "m3-2": TMP_DIR / "bg_m3_2.jpg",
        "m3-3": TMP_DIR / "bg_m3_3.jpg",
    }

    m3_tasks = [
        ("m3-1", m3_1_w, m3_1_s),
        ("m3-2", m3_2_w, m3_2_s),
        ("m3-3", m3_3_w, m3_3_s),
    ]

    for name, fn_w, fn_s in m3_tasks:
        bg = m3_bgs[name]
        if not bg.exists():
            print(f"\n[SKIP] {name}: 배경 이미지 없음 ({bg})")
            fail += 2
            continue

        print(f"\n[{name}] 배경: {bg.name}")

        html_w = fn_w(bg)
        capture(html_w, M3_OUT / f"{name}-1200x628.png", 1200, 628)
        success += 1

        html_s = fn_s(bg)
        capture(html_s, M3_OUT / f"{name}-1080x1080.png", 1080, 1080)
        success += 1

    # ── 결과 요약 ────────────────────────────────────────────────────────────

    elapsed = time.time() - t0
    print(f"\n{'=' * 60}")
    print(f"재렌더링 완료: 성공 {success}/18, 실패 {fail}, 소요 {elapsed:.1f}초")
    print("=" * 60)


if __name__ == "__main__":
    main()
