
    Si;                        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-2 Problem slide image generator.

Meta ad carousel slide — 1080x1080px
Save to: /home/jay/workspace/output/meta-ads/a-group-venus/venus-A2-problem.png
    )annotationsN)Path)WORKSPACE_ROOTz2output/meta-ads/a-group-venus/venus-A2-problem.pngzgemini-3-pro-image-previewzgemini-3.1-flash-image-previewz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languageu  Create a 1080x1080 square Korean premium advertising image for Meta (Facebook/Instagram) ads.

BACKGROUND SCENE: Photorealistic cinematic photograph — rain streaming down a large dark window at night. Through the glass, blurred bokeh city lights (Seoul cityscape) glow amber and white in the distance. The scene conveys deep isolation, melancholy, and suppressed frustration. The overall background tone is dark gray (not pure black — slightly lighter, around #1A1A1F) with subtle cool undertones. The rain droplets on glass create a visual metaphor for tears, obstacles, burdens.

PHOTOGRAPHIC QUALITY: Shot on ARRI Alexa 65. f/1.8 wide aperture. Shallow depth of field. Rain droplets sharp in foreground, city lights softly bokeh'd behind. Cinematic 2.39:1 feel cropped to 1:1 square. No stock-photo look. No lens flares or clichéd effects.

TYPOGRAPHY LAYOUT — LEFT-ALIGNED, positioned in the lower-left to center-left area with generous left margin (about 80px from left edge):

LINE 1 (Headline part 1): "문제는 노력이 아니다."
— Bold Korean sans-serif, white (#FFFFFF), font size approximately 62px, bold weight (700+), left-aligned

LINE 2 (Headline part 2 — ACCENT): "방법이 없었던 거다."
— Bold Korean sans-serif, warm golden amber color (#D4A017 or #C8930A), same size ~62px, bold weight (700+), left-aligned. This line must clearly contrast against the dark background.

[small vertical spacer ~20px]

LINE 3 (Subheadline line 1): "지인 명단은 바닥났고, 알려줄 멘토도 없었다."
— Korean sans-serif, light gray-white (#C8C8CC), approximately 36px, weight 400-500, left-aligned

LINE 4 (Subheadline line 2 — slightly bolder): "혼자 버티는 건 미덕이 아니라 손실이다."
— Korean sans-serif, slightly brighter white (#E0E0E4), approximately 38px, weight 500-600, left-aligned. This line carries more emotional weight.

PAGE INDICATOR: "2/5" — small, right-aligned in bottom-right corner, approximately 28px, gray (#888894), clean minimal style.

DESIGN RULES:
- ALL Korean text must be perfectly rendered, accurate characters, no distortion
- Minimum 40px equivalent for all text elements
- Text must pass WCAG AAA contrast against the dark background
- No logos, no line-art icons, no glassmorphism effects, no geometric graphic elements
- No thin/light font weights (400+ only)
- The golden amber accent color (#D4A017) must contrast clearly — do NOT use orange if background has orange cast
- Professional advertising quality — not a stock photo aesthetic
- The emotional goal: viewer feels "yes, it wasn't my effort that was lacking — I just had no system/method" — suppressed frustration + righteous recognition

STYLE REFERENCE: Premium Korean financial/coaching advertisement. Christopher Nolan cinematic color grading. Dark, atmospheric, premium editorial feel.

IMPORTANT — large bold Korean text, easily readable on mobile, cinematic dark background, photorealistic rain on window scene, no watermark, no clipart, no icons.
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 )
z$Get auth token via SA or gcloud CLI.r   ztools/ai-image-genNz[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       X/home/jay/workspace/.worktrees/task-2117-dev1/tools/ai-image-gen/gen_venus_a2_problem.py	get_tokenr   @   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   T   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$                  |
      }d|	v rdnd }t         j&                  j)                         |k(  rt         nt         j+                  |      }|j-                  |       |j/                         j0                  }t        d!|        t        d"|d#d$|d%z  d&d'       t        d(|	        t        d)|d*kD  rd+nd,        y c c}w )-NT)parentsexist_okz<============================================================u-   Venus A-2 Problem — Gemini 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 in response: i,  r   contentr    
inlineDatar
    z*[ERROR] No image in response. Text parts:    mimeTypez
image/jpegdatajpegz.jpgz.pngz
[SUCCESS] Saved: z  Size: ,z bytes (i   z.1fz KB)z  MIME: z  Min quality check: i PASSzWARN: < 100KB)OUTPUT_PATHparentmkdirr   r   lenr2   MODEL_IDstatus_codeFALLBACK_MODEL_IDokr
   r   exitr)   getr   base64	b64decodesuffixlowerwith_suffixwrite_bytesstatst_size)r   responser>   r8   r    
image_partpartp
text_parts	mime_type	image_b64image_bytesext	save_path	file_sizes                  r   mainr_   e   s   TD9	(O	
9:	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3CIdsO3DEFqMi,00"=EJ 4J
 16FA&A+aeeFB'F
F::bq>:JKL<(,,ZFI<(0I""9-K i'&VC*11779S@kF]F]^aFbI+& ((I		{
+,	HYqM)d*:3)?t
DE	HYK
 !	!I,?&_!U
VW# Gs   '	K1K__main__)returnr   )r   r   r/   r   ra   zrequests.Response)ra   None)__doc__
__future__r   rL   r   r   pathlibr   r-   
gen_configr   rB   rF   rH   r+   r   r,   r   r2   r_   __name__ r3   r   <module>ri      so    #   
   %SS'4 DD&
R(J"6Xr zF r3   