
    iL                        d Z ddlmZ ddlZddlZddlZddlmZ ddlZddl	m
Z
 e
dz  ZdZdZd	Zd
ZdZddZddZddZedk(  r e        yy)u   Venus A-4 Proof slide — PURE Gemini native image generation.

No HTML/Playwright. Korean text rendered by Gemini Pro directly.
Output: 1080x1080 PNG → /home/jay/workspace/output/meta-ads/a-group-venus/venus-A4-proof.png
    )annotationsN)Path)WORKSPACE_ROOTz0output/meta-ads/a-group-venus/venus-A4-proof.pngzgemini-3-pro-image-previewzgemini-3.1-flash-image-previewz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languageuD
  Create a 1080x1080 square Korean premium advertising image for Meta (Facebook/Instagram) ads. This is slide 4 of 5 in a carousel — the "social proof / testimonials" slide.

BACKGROUND: Clean, bright, elegant. Light cream (#F8F5F0) or warm off-white background. Minimal texture — perhaps subtle paper grain or soft warm light from the top. This slide should feel open, trustworthy, transparent. It is one of the brightest slides in the series (transition from dark themes in previous slides to bright here).

LAYOUT:

TOP SECTION (15% height):
- Headline: "방법을 바꾼 사람들이 말하는 실제 변화."
- Dark text (#1A0E00 or dark brown), bold Korean sans-serif, approximately 52px
- The words "실제 변화" should be rendered in dark gold (#A07828) color for accent
- Center-aligned

MIDDLE SECTION (60% height) — TWO TESTIMONIAL QUOTE CARDS stacked vertically:

CARD 1:
- Left border: 4px gold (#C9A84C) vertical accent bar
- Large Korean quotation mark at top-left of card in gold
- Quote text: "거절이 두려웠는데, 이제는 고객을 선택합니다."
- Dark text (#2A1A0A), approximately 44px, Korean sans-serif, weight 500
- Attribution: "— 이○○" in bold, right-aligned below quote, dark brown
- Card background: white (#FFFFFF) with subtle shadow

CARD 2:
- Same style as Card 1
- Quote text: "자동 유입 시스템으로 걱정 없는 영업이 됐습니다."
- Attribution: "— 김○○" in bold

Cards should have subtle drop shadow, clean white background, and gold left accent bar.

BOTTOM SECTION (25% height):
- Attribution line: "서울대보험쌤 팀의 5가지 시스템 안에서 시작한 이야기입니다."
- Gray (#888888) text, approximately 40px, italic or lighter weight, center-aligned

PAGE INDICATOR: "4/5" — bottom-right corner, approximately 40px, dark gold (#A07828).

DESIGN RULES:
- ALL Korean text must be perfectly rendered — accurate characters, no distortion
- Every text element at minimum 40px
- On bright background: use DARK text colors for WCAG AAA contrast
- Gold accent (#A07828 for dark gold on light bg) must contrast clearly
- No logos, no photos of people, no group images, no trophies, no company charts
- No internal labels ("A-4", "PROOF")
- Clean, premium, trustworthy feel — like a luxury brand testimonial page
- Professional advertising quality

STYLE REFERENCE: Premium Korean coaching/consulting advertisement. Clean editorial design. Bright, trust-building, elegant typography.

IMPORTANT — clear Korean text, testimonial card layout, bright clean background, gold accent elements, no watermark, easily readable on mobile.
c                 f   t         j                  j                  dt        t        dz               	 dd l} | j                  t              S # t        $ r}t        d| d       Y d }~nd }~ww xY wt        j                  g ddd      }|j                  j                         }|st        d      |S )	Nr   ztools/ai-image-genz[AUTH] SA token failed: z, trying gcloud CLI...)gcloudauthzprint-access-tokenz<--scopes=https://www.googleapis.com/auth/generative-languageT)capture_outputtextz3gcloud auth print-access-token returned empty token)syspathinsertstrr   gcloud_authget_service_account_tokenGEMINI_SCOPE	Exceptionprint
subprocessrunstdoutstripRuntimeError)r   eresulttokens       ]/home/jay/workspace/.worktrees/task-2116-dev1/tools/ai-image-gen/gen_venus_a4_proof_native.py	get_tokenr   K   s    HHOOAs>,@@ABD44\BB D(+ABCCD ^^	I$F
 MM!EPQQLs   A 	A-A((A-c                    t          d| d}d|  dd}ddt        igigdd	gd
dd}t        d|        t        j                  |||d      S )Nz/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-Typepartsr
   IMAGETEXTg      ?)responseModalitiestemperature)contentsgenerationConfigz[API] Calling model:    )headersjsontimeout)GEMINI_API_BASEPROMPTr   requestspost)r   model_idurlr(   payloads        r   call_geminir2   ^   s}    XhZ/?
@C"5'**G
  0123#*F"3
G 
!(
,-==gGSII    c                    t         j                  j                  dd       t        d       t        d       t        dt                 t        d       t        d       t	               } t        dt        |        d       t        | t              }|j                  d	v r/t        d
|j                   dt                t        | t              }|j                  s=t        d|j                   d|j                  d d         t        j                  d       |j                         }|j                  dg       }|s/t        dt!        |      d d         t        j                  d       |d   j                  di       j                  dg       }d }|D ]
  }d|v s|} n |J|D cg c]  }d|v s|j                  dd       }}t        d|d d         t        j                  d       |d   j                  dd      }	|d   d   }
t#        j$                  |
      }t         j'                  d|	v rdnd       }|j)                  |       d|	v r9dd!lm} |j/                  |      }|j1                  t         d"       t        d#       n|t         k7  r|j3                  t                t         j5                         j6                  }t        d$t                 t        d%|d&d'|d(z  d)d*       t        d+|	        dd!lm} |j/                  t               }t        d,|j8                  d    d-|j8                  d           y c c}w ).NT)parentsexist_okz<============================================================u7   Venus A-4 Proof — PURE Gemini Native Image GenerationzOutput: z
[AUTH] Obtaining token...z[AUTH] Token obtained (z chars))i  i  z[API] Pro model failed (z), falling back to z[ERROR] HTTP z: i     
candidatesz[ERROR] No candidates: i,  r   contentr    
inlineDatar
    z$[ERROR] No image in response. Text:    mimeTypez
image/jpegdatajpegz.jpgz.png)ImagePNGu   [CONVERT] JPEG → PNGz
[SUCCESS] Saved: z  Size: ,z bytes (i   z.1fz KB)z  MIME source: z  Dimensions: x)OUTPUT_PATHparentmkdirr   r   lenr2   MODEL_IDstatus_codeFALLBACK_MODEL_IDokr
   r   exitr)   getr   base64	b64decodewith_suffixwrite_bytesPILr@   opensaverenamestatst_sizesize)r   responser>   r8   r    
image_partpartp
text_parts	mime_type	image_b64image_bytesraw_pathr@   img	file_sizes                   r   mainrd   o   s   TD9	(O	
CD	H[M
"#	(O	
'(KE	#CJ<w
785(+Hz)()=)=(>>QRcQdefu&78;;h2232hmmDS6I5JKL==?D,+J'D	$3'89:qMi,00"=EJ 4J
 16FA&A+aeeFB'F
F4Z^4DEF<(,,ZFI<(0I""9-K&&91Dv&QH%jj"e$&'{"OOK(  "**I	}
-.	HYqM)d*:3)?t
DE	OI;
'(
**[
!C	N388A;-q!
677 Gs   '	M1M__main__)returnr   )r   r   r/   r   rf   zrequests.Response)rf   None)__doc__
__future__r   rN   r   r   pathlibr   r-   
gen_configr   rD   rH   rJ   r+   r   r,   r   r2   rd   __name__ r3   r   <module>rn      sn    #   
   %QQ'4 DD1
h&J">8B zF r3   