#!/usr/bin/env python3
"""Step 1: Gemini Pro로 3인 프로필 배경 이미지 생성 (concept #19 페르소나 카드)"""

import base64
import subprocess
import sys
import time
from pathlib import Path

import requests

OUTPUT_PATH = Path("/home/jay/workspace/output/meta-ads/concept-catalog/19-persona-card/bg.png")

PROMPT = (
    "Three professional Korean business people portrait headshots arranged side by side "
    "against a clean light gray background (hex #F4F6FA). "
    "Left person: a confident Korean woman in her late 20s, warm genuine smile, "
    "wearing a light blue professional blouse, shoulder-length hair. "
    "Center person: a composed Korean man in his early 40s, slight reassuring smile, "
    "wearing a dark navy suit with white shirt, short hair, professional demeanor. "
    "Right person: an energetic Korean woman in her early 30s, bright enthusiastic smile, "
    "wearing a smart casual charcoal blazer, modern hairstyle. "
    "All three are portrait headshots from shoulders up. "
    "Professional studio lighting, soft shadows, photorealistic quality. "
    "Three equal-width panels side by side, each panel 360x400px roughly. "
    "Clean minimal background #F4F6FA throughout. "
    "No text, no watermarks, no logos. 1080x1080 square format."
)

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


def get_token():
    sys.path.insert(0, "/home/jay/workspace/tools/ai-image-gen")
    import gcloud_auth
    return gcloud_auth.get_service_account_token(GEMINI_SCOPE)


def call_gemini(token, model_id, prompt):
    url = f"{GEMINI_API_BASE}/models/{model_id}:generateContent"
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
    }
    payload = {
        "contents": [{"parts": [{"text": prompt}]}],
        "generationConfig": {
            "responseModalities": ["IMAGE", "TEXT"],
            "temperature": 1.0,
        },
    }
    return requests.post(url, headers=headers, json=payload, timeout=180)


def main():
    OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
    print("[1] SA 토큰 획득 중...")
    token = get_token()
    print(f"[1] 토큰 획득 완료 (길이: {len(token)})")

    print(f"[2] Gemini 이미지 생성 요청 중... (모델: {MODEL_ID})")
    start = time.time()
    resp = call_gemini(token, MODEL_ID, PROMPT)

    if resp.status_code in (403, 404):
        print(f"[2] Pro 모델 실패 (HTTP {resp.status_code}), fallback: {FALLBACK_MODEL_ID}")
        resp = call_gemini(token, FALLBACK_MODEL_ID, PROMPT)

    resp.raise_for_status()
    elapsed = time.time() - start
    print(f"[2] 응답 수신 ({elapsed:.1f}초)")

    data = resp.json()
    candidates = data.get("candidates", [])
    if not candidates:
        print(f"[ERROR] 응답에 candidates 없음: {str(data)[:300]}")
        sys.exit(1)

    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]
        print(f"[ERROR] 이미지 데이터 없음. 텍스트: {text_parts[:2]}")
        sys.exit(1)

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

    OUTPUT_PATH.write_bytes(image_bytes)
    size_kb = OUTPUT_PATH.stat().st_size / 1024
    print(f"[3] 저장 완료: {OUTPUT_PATH} ({size_kb:.0f} KB, mime={mime_type})")


if __name__ == "__main__":
    main()
