#!/usr/bin/env python3
"""슬라이드 5 (CTA - Final) - T.O.P 리크루팅 캠페인 Angle A"""

import sys
import base64
import requests
import time
import os
from pathlib import Path

sys.path.insert(0, '/home/jay/workspace/tools/ai-image-gen')
import gcloud_auth

OUTPUT_DIR = Path('/home/jay/workspace/output/meta-ads/angle-A/v6-benchmark')
OUTPUT_PATH = OUTPUT_DIR / 'slide-05.png'
BG_PATH = OUTPUT_DIR / 'slide-05-bg.jpg'

BG_PROMPT = (
    "Bold energetic abstract background with warm orange (#EA580C) tones and dynamic shapes at the top "
    "transitioning smoothly to deep navy (#003B5C) at the bottom. "
    "Dynamic diagonal geometric shapes and light streaks suggesting forward momentum and urgent action. "
    "Abstract design — no text, no people, no logos, no watermarks. "
    "Professional but urgent atmosphere. Clean center and bottom areas for text overlay. "
    "1080x1080 square format. "
    "Premium advertising background quality. High contrast between warm orange top and cool navy bottom."
)

HTML_TEMPLATE = '''<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  @import url('https://fonts.googleapis.com/css2?family=Black+Han+Sans&family=Noto+Sans+KR:wght@400;500;600;700;800;900&display=swap');

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1080px;
    height: 1080px;
    overflow: hidden;
    font-family: 'Noto Sans KR', sans-serif;
  }

  .container {
    width: 1080px;
    height: 1080px;
    position: relative;
    background: linear-gradient(180deg, #EA580C 0%, #6B2A00 35%, #1a3a52 65%, #003B5C 100%);
    overflow: hidden;
  }

  .bg-image {
    position: absolute;
    top: 0; left: 0;
    width: 100%; height: 100%;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
  }

  /* Center overlay for better text readability */
  .center-overlay {
    position: absolute;
    top: 25%;
    left: 0; right: 0;
    height: 55%;
    background: linear-gradient(
      to bottom,
      rgba(0, 20, 35, 0) 0%,
      rgba(0, 20, 35, 0.45) 50%,
      rgba(0, 20, 35, 0) 100%
    );
    pointer-events: none;
  }

  /* Bottom overlay */
  .bottom-overlay {
    position: absolute;
    bottom: 0; left: 0; right: 0;
    height: 45%;
    background: linear-gradient(
      to bottom,
      rgba(0, 59, 92, 0) 0%,
      rgba(0, 59, 92, 0.65) 60%,
      rgba(0, 59, 92, 0.85) 100%
    );
    pointer-events: none;
  }

  /* TOP URGENCY BADGE */
  .urgency-badge-area {
    position: absolute;
    top: 80px;
    left: 0; right: 0;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .urgency-pill {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: #EA580C;
    color: #FFFFFF;
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 44px;
    font-weight: 700;
    padding: 16px 40px;
    border-radius: 999px;
    letter-spacing: -0.5px;
    box-shadow: 0 4px 16px rgba(234,88,12,0.45);
  }

  /* CENTER HEADLINE */
  .headline-area {
    position: absolute;
    top: 360px;
    left: 0; right: 0;
    text-align: center;
    padding: 0 64px;
  }

  .headline-line {
    display: block;
    font-family: 'Black Han Sans', 'Noto Sans KR', sans-serif;
    font-size: 96px;
    font-weight: 900;
    color: #FFFFFF;
    line-height: 1.2;
    letter-spacing: -3px;
    text-shadow: 0 2px 20px rgba(0,0,0,0.5);
  }

  .headline-highlight {
    color: #EA580C;
  }

  /* CTA BUTTON */
  .cta-button-area {
    position: absolute;
    bottom: 200px;
    left: 0; right: 0;
    display: flex;
    justify-content: center;
  }

  .cta-button {
    display: inline-block;
    background: #003B5C;
    color: #FFFFFF;
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 48px;
    font-weight: 700;
    padding: 32px 96px;
    border-radius: 16px;
    border: 3px solid rgba(255,255,255,0.25);
    letter-spacing: -1px;
    box-shadow: 0 8px 32px rgba(0,0,0,0.4);
  }

  /* DISCLAIMER */
  .disclaimer-area {
    position: absolute;
    bottom: 120px;
    left: 0; right: 0;
    text-align: center;
    padding: 0 64px;
  }

  .disclaimer-text {
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 40px;
    font-weight: 400;
    color: #CCCCCC;
    letter-spacing: -0.5px;
    line-height: 1.4;
  }
</style>
</head>
<body>
<div class="container">
  <!-- Background image -->
  <div class="bg-image" id="bg-div"></div>

  <!-- Overlays -->
  <div class="center-overlay"></div>
  <div class="bottom-overlay"></div>

  <!-- 1. URGENCY BADGE (top) -->
  <div class="urgency-badge-area">
    <span class="urgency-pill">⏰ 2026년 7월 변경 예정</span>
  </div>

  <!-- 2. HEADLINE (center) -->
  <div class="headline-area">
    <span class="headline-line">분급 전 <span class="headline-highlight">마지막</span> 혜택을</span>
    <span class="headline-line">선점하세요.</span>
  </div>

  <!-- 3. CTA BUTTON -->
  <div class="cta-button-area">
    <span class="cta-button">지금 상담 신청하기</span>
  </div>

  <!-- 4. DISCLAIMER -->
  <div class="disclaimer-area">
    <span class="disclaimer-text">모집수수료는 실적에 따라 다를 수 있습니다</span>
  </div>
</div>

<script>
function setBg(bgPath) {
  document.getElementById('bg-div').style.backgroundImage = "url('" + bgPath + "')";
}
</script>
</body>
</html>'''


def get_token():
    """Gemini API 토큰 획득."""
    import subprocess
    try:
        result = subprocess.run(
            ['gcloud', 'auth', 'print-access-token',
             '--scopes=https://www.googleapis.com/auth/generative-language'],
            capture_output=True, text=True, check=True
        )
        token = result.stdout.strip()
        if token:
            return token
    except Exception:
        pass
    return gcloud_auth.get_access_token()


def generate_background(token):
    """Gemini API로 배경 이미지 생성."""
    url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent'
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json',
    }
    payload = {
        'contents': [{'parts': [{'text': BG_PROMPT}]}],
        'generationConfig': {
            'responseModalities': ['IMAGE', 'TEXT'],
        }
    }

    print("배경 이미지 생성 중... (약 30-60초 소요)")
    start = time.time()
    response = requests.post(url, headers=headers, json=payload, timeout=300)
    elapsed = time.time() - start
    print(f"응답 수신: {elapsed:.1f}초, 상태코드: {response.status_code}")

    if response.status_code not in (200,):
        # Fallback to flash model
        print(f"Pro 모델 실패 (HTTP {response.status_code}), Flash 모델로 재시도...")
        url_flash = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent'
        response = requests.post(url_flash, headers=headers, json=payload, timeout=300)
        elapsed = time.time() - start
        print(f"Flash 응답: {elapsed:.1f}초, 상태코드: {response.status_code}")

    if response.status_code != 200:
        print("오류 응답:", response.text[:500])
        return None

    data = response.json()
    candidates = data.get('candidates', [])
    if not candidates:
        print("candidates 없음")
        return None

    parts = candidates[0].get('content', {}).get('parts', [])
    for part in parts:
        if 'inlineData' in part:
            mime_type = part['inlineData'].get('mimeType', 'image/jpeg')
            image_bytes = base64.b64decode(part['inlineData']['data'])
            ext = '.jpg' if 'jpeg' in mime_type else '.png'
            bg_save_path = BG_PATH.with_suffix(ext)
            bg_save_path.write_bytes(image_bytes)
            print(f"배경 이미지 저장: {bg_save_path} ({len(image_bytes):,} bytes)")
            return str(bg_save_path)

    print("이미지 파트 없음")
    return None


def render_with_playwright(bg_path=None):
    """Playwright로 HTML 오버레이 렌더링 및 PNG 캡처."""
    from playwright.sync_api import sync_playwright

    html_path = OUTPUT_DIR / 'slide-05-overlay.html'
    html_path.write_text(HTML_TEMPLATE, encoding='utf-8')

    with sync_playwright() as p:
        browser = p.chromium.launch()
        try:
            page = browser.new_page(viewport={"width": 1080, "height": 1080})
            page.goto(f"file://{html_path.resolve()}", wait_until="networkidle")

            if bg_path:
                bg_file_url = f"file://{bg_path}"
                page.evaluate(f"setBg('{bg_file_url}')")

            page.wait_for_timeout(3000)

            OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
            page.screenshot(path=str(OUTPUT_PATH), type="png")
            print(f"최종 이미지 저장: {OUTPUT_PATH}")
        finally:
            browser.close()

    html_path.unlink(missing_ok=True)


def main():
    print("=" * 60)
    print("슬라이드 5 (CTA - Final) 생성 시작")
    print(f"출력 경로: {OUTPUT_PATH}")
    print("=" * 60)

    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)

    # 1. 배경 이미지 생성
    print("\n[1단계] Gemini API 토큰 획득...")
    token = get_token()
    print(f"토큰 획득 성공: {len(token)} chars")

    print("\n[2단계] 배경 이미지 생성...")
    bg_path = generate_background(token)

    if bg_path is None:
        print("배경 이미지 생성 실패 - CSS 그라디언트 배경으로 진행")

    # 2. HTML 오버레이 렌더링
    print("\n[3단계] HTML 오버레이 렌더링...")
    render_with_playwright(bg_path)

    size_kb = OUTPUT_PATH.stat().st_size / 1024
    print(f"\n완료: {OUTPUT_PATH} ({size_kb:.0f} KB)")
    print("=" * 60)


if __name__ == '__main__':
    main()
