#!/usr/bin/env python3
"""컨셉 #03 Anti-Polish 배경 이미지 생성 (Gemini API)"""

import base64
import sys
from pathlib import Path

# gcloud_auth 경로 추가
sys.path.insert(0, "/home/jay/workspace/tools/ai-image-gen")
import gcloud_auth
import requests

OUTPUT_DIR = Path("/home/jay/workspace/output/meta-ads/concept-catalog/03-anti-polish")
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)

BG_PROMPT = (
    "Crumpled notebook paper texture, slightly yellowed with age, "
    "natural soft lighting from above, realistic paper wrinkles and fold lines, "
    "subtle grain texture, cream and off-white tones, no text, no lines, "
    "flat lay photography style, 1080x1080 square format"
)

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

def generate_bg():
    print("[Step 1] Gemini API로 배경 이미지 생성 중...")

    # SA 토큰 인증 방식 우선 사용 (API 키는 무료 티어 한도 초과 가능)
    print("  SA 토큰 인증 방식 사용")
    token = gcloud_auth.get_service_account_token(GEMINI_SCOPE)
    url = f"{GEMINI_API_BASE}/models/{MODEL_ID}:generateContent"
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
    }

    payload = {
        "contents": [{"parts": [{"text": BG_PROMPT}]}],
        "generationConfig": {"responseModalities": ["IMAGE", "TEXT"]},
    }

    print(f"  모델: {MODEL_ID}")
    print(f"  프롬프트: {BG_PROMPT[:80]}...")

    response = requests.post(url, headers=headers, json=payload, timeout=120)

    if response.status_code != 200:
        print(f"  [오류] HTTP {response.status_code}: {response.text[:500]}")
        # Fallback: imagen-3.0 시도
        print("  Fallback: gemini-3-pro-image-preview 시도...")
        fallback_model = "gemini-3-pro-image-preview"
        url2 = f"{GEMINI_API_BASE}/models/{fallback_model}:generateContent"
        response = requests.post(url2, headers=headers, json=payload, timeout=120)
        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_b64 = image_part["inlineData"]["data"]
    image_bytes = base64.b64decode(image_b64)

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

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


if __name__ == "__main__":
    bg_path = generate_bg()
    print(f"\nBG_PATH={bg_path}")
