#!/usr/bin/env python3
"""컨셉 #03 Anti-Polish v2 하이브리드 이미지 생성
Gemini API 배경 생성 + HTML/Playwright 텍스트 오버레이
"""

import base64
import shutil
import sys
from pathlib import Path

sys.path.insert(0, "/home/jay/workspace/tools/ai-image-gen")
import gcloud_auth
import requests
from playwright.sync_api import sync_playwright

OUTPUT_DIR = Path("/home/jay/workspace/output/meta-ads/concept-catalog/03-anti-polish")
TEMPLATE_PATH = OUTPUT_DIR / "template-v2.html"
BG_PATH = OUTPUT_DIR / "bg-v2.png"
RENDER_HTML_PATH = OUTPUT_DIR / "_render_v2.html"
SAMPLE_PATH = OUTPUT_DIR / "sample-v2.png"
COPY_PATH = OUTPUT_DIR / "03-anti-polish-v2.png"

BG_PROMPT = (
    "Crumpled notebook paper texture, slightly yellowed with age, "
    "natural soft lighting from above, realistic paper wrinkles and fold lines, "
    "visible crease marks and subtle shadows, cream and off-white tones, "
    "no text, no ruled lines, no printed content, "
    "flat lay photography style, 1080x1080 square format, high resolution, photorealistic"
)

MODEL_ID = "gemini-2.5-flash-image"
FALLBACK_MODEL_ID = "gemini-3-pro-image-preview"
GEMINI_API_BASE = "https://generativelanguage.googleapis.com/v1beta"
GEMINI_SCOPE = "https://www.googleapis.com/auth/generative-language"


def generate_bg() -> Path:
    """Gemini API로 배경 이미지 생성 후 저장."""
    print("[Step 1] Gemini API로 배경 이미지 생성 중...")
    token = gcloud_auth.get_service_account_token(GEMINI_SCOPE)

    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
    }
    payload = {
        "contents": [{"parts": [{"text": BG_PROMPT}]}],
        "generationConfig": {"responseModalities": ["IMAGE", "TEXT"]},
    }

    url = f"{GEMINI_API_BASE}/models/{MODEL_ID}:generateContent"
    print(f"  모델: {MODEL_ID}")
    response = requests.post(url, headers=headers, json=payload, timeout=180)

    if response.status_code not in (200,):
        print(f"  [경고] HTTP {response.status_code} — Fallback 모델 시도: {FALLBACK_MODEL_ID}")
        url = f"{GEMINI_API_BASE}/models/{FALLBACK_MODEL_ID}:generateContent"
        response = requests.post(url, headers=headers, json=payload, timeout=180)
        response.raise_for_status()

    data = response.json()
    candidates = data.get("candidates", [])
    if not candidates:
        raise RuntimeError(f"응답에 candidates 없음: {str(data)[:300]}")

    parts = candidates[0].get("content", {}).get("parts", [])
    image_part = None
    for part in parts:
        if "inlineData" in part:
            image_part = part
            break

    if image_part is None:
        text_parts = [p.get("text", "") for p in parts if "text" in p]
        raise RuntimeError(f"이미지 데이터 없음. 텍스트 응답: {text_parts[:2]}")

    mime_type = image_part["inlineData"].get("mimeType", "image/jpeg")
    image_bytes = base64.b64decode(image_part["inlineData"]["data"])

    ext = ".jpg" if "jpeg" in mime_type else ".png"
    bg_out = OUTPUT_DIR / f"bg-v2{ext}"
    bg_out.write_bytes(image_bytes)

    size_kb = bg_out.stat().st_size / 1024
    print(f"  [완료] 배경 저장: {bg_out} ({size_kb:.0f} KB, {mime_type})")
    return bg_out


def render_overlay(bg_path: Path) -> None:
    """HTML 템플릿에 배경 주입 후 Playwright로 1080x1080 PNG 캡처."""
    print("[Step 2] HTML 오버레이 렌더링 중...")

    if not TEMPLATE_PATH.exists():
        raise FileNotFoundError(f"템플릿 없음: {TEMPLATE_PATH}")

    template_html = TEMPLATE_PATH.read_text(encoding="utf-8")
    bg_file_url = f"file://{bg_path.resolve()}"
    render_html = template_html.replace("__BG_IMAGE__", bg_file_url)
    RENDER_HTML_PATH.write_text(render_html, encoding="utf-8")
    print(f"  렌더링용 HTML: {RENDER_HTML_PATH}")

    print("[Step 3] Playwright 스크린샷 캡처 중...")
    with sync_playwright() as p:
        browser = p.chromium.launch(
            args=[
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--font-render-hinting=none",
            ]
        )
        try:
            context = browser.new_context(
                viewport={"width": 1080, "height": 1080},
                device_scale_factor=1,
            )
            page = context.new_page()
            page_url = f"file://{RENDER_HTML_PATH.resolve()}"
            page.goto(page_url, wait_until="networkidle", timeout=30000)

            # Google Fonts 로딩 대기
            page.wait_for_timeout(5000)
            page.evaluate("() => document.fonts.ready")
            page.wait_for_timeout(1000)

            SAMPLE_PATH.parent.mkdir(parents=True, exist_ok=True)
            page.screenshot(
                path=str(SAMPLE_PATH),
                type="png",
                clip={"x": 0, "y": 0, "width": 1080, "height": 1080},
            )
            print(f"  [캡처 완료] {SAMPLE_PATH}")
        finally:
            browser.close()

    size_kb = SAMPLE_PATH.stat().st_size / 1024
    print(f"  파일 크기: {size_kb:.0f} KB")


def copy_final() -> None:
    """sample-v2.png → 03-anti-polish-v2.png 복사."""
    shutil.copy2(SAMPLE_PATH, COPY_PATH)
    size_kb = COPY_PATH.stat().st_size / 1024
    print(f"[Step 4] 복사 완료: {COPY_PATH} ({size_kb:.0f} KB)")


def verify_font_rules() -> None:
    """폰트 크기 규칙 준수 여부 최종 확인 (브리프 v2 기준)."""
    print("\n[검증] 폰트 크기 규칙 확인 (브리프 v2 기준)")
    rules = [
        ("메인 '제자리걸음?'", 88, 84, "핵심 메시지 84px 이상"),
        ("보조 '열심히 하는데...'", 64, 64, "보조 메시지 64px 이상"),
        ("형광펜 '정착지원금 1,000만원'", 68, 64, "보조 메시지 64px 이상"),
        ("포스트잇 'T.O.P 상담신청'", 44, 40, "최소 40px 이상"),
    ]
    all_ok = True
    for name, actual, minimum, rule in rules:
        ok = actual >= minimum
        status = "OK" if ok else "FAIL"
        if not ok:
            all_ok = False
        print(f"  [{status}] {name}: {actual}px (규칙: {rule})")
    if all_ok:
        print("  => 모든 폰트 크기 규칙 준수 완료!")
    else:
        print("  => 일부 규칙 위반 — 수정 필요!")


if __name__ == "__main__":
    print("=" * 60)
    print("컨셉 #03 Anti-Polish v2 하이브리드 이미지 생성")
    print("=" * 60)

    bg_path = generate_bg()
    render_overlay(bg_path)
    copy_final()
    verify_font_rules()

    print("\n" + "=" * 60)
    print("생성 완료!")
    print(f"  sample-v2.png  : {SAMPLE_PATH}")
    print(f"  최종 파일      : {COPY_PATH}")
    print("=" * 60)
