#!/usr/bin/env python3
import os, base64, pathlib, requests, json, re, sys
from PIL import Image, ImageDraw, ImageFont
import qrcode

ROOT=pathlib.Path('/home/ubuntu/lobbytracker')
OUT=ROOT/'public/cards/generated'
OUT.mkdir(parents=True, exist_ok=True)
REF=pathlib.Path('/home/ubuntu/.hermes/image_cache/img_184c12b449fc.jpg')
ref_b64=base64.b64encode(REF.read_bytes()).decode()
KEY=os.environ.get('OPENROUTER_API_KEY')
if not KEY:
    p=pathlib.Path.home()/'.hermes/.env'
    for line in p.read_text().splitlines():
        if line.startswith('OPENROUTER_API_KEY='):
            KEY=line.split('=',1)[1].strip().strip('"')
if not KEY: raise SystemExit('missing OPENROUTER_API_KEY')

people=[
  {
    'name':'Myriam Bregman','slug':'myriam-bregman','qr':'https://lobbytracker.vercel.app/p/69be50fb-489f-4dc8-a148-b7dc178ffc5a',
    'subtitle':'SIN PLATA / SIN CONEXIONES COOPERATIVAS',
    'bullets':['0 CONTRATOS DOCUMENTADOS','0 VIAJES A ISRAEL ENCONTRADOS','0 REUNIONES COOPERATIVAS ENCONTRADAS','0 PROCUREMENT / SEGURIDAD','MENCIONES DAIA/OSA: ADVERSARIALES','POSICIÓN PÚBLICA PRO-PALESTINA']
  },
  {
    'name':'Nicolás del Caño','slug':'nicolas-del-cano','qr':'https://lobbytracker.vercel.app/p/63976f74-2d23-4c4b-8434-76cc0d551315',
    'subtitle':'SIN PLATA / SIN CONEXIONES COOPERATIVAS',
    'bullets':['0 CONTRATOS DOCUMENTADOS','0 VIAJES A ISRAEL ENCONTRADOS','0 REUNIONES COOPERATIVAS ENCONTRADAS','0 PROCUREMENT / SEGURIDAD','DISCURSOS CRÍTICOS DE ISRAEL','POSICIÓN PÚBLICA PRO-PALESTINA']
  }
]

def overlay_qr(path, qr_url):
    im=Image.open(path).convert('RGB'); W,H=im.size
    qr=qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=10, border=2)
    qr.add_data(qr_url); qr.make(fit=True)
    q=qr.make_image(fill_color='black', back_color='white').convert('RGB')
    size=int(W*0.145); q=q.resize((size,size), Image.Resampling.NEAREST)
    pad=int(W*0.022); x=W-size-pad; y=H-size-int(H*0.035)
    d=ImageDraw.Draw(im)
    d.rounded_rectangle([x-8,y-8,x+size+8,y+size+24], radius=10, fill=(245,245,240))
    im.paste(q,(x,y))
    try: font=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Bold.ttf', int(W*0.022))
    except Exception: font=None
    d.text((x+size/2,y+size+3),'ESCANEAR',fill=(0,0,0),font=font,anchor='ma')
    im.save(path, quality=95)

def prompt(p):
    bullets='\n'.join(f'"{b}"' for b in p['bullets'])
    return f'''Usá la imagen adjunta como benchmark de calidad/composición, pero crear una versión VERDE, limpia y contrastante para un político sin conexiones documentadas.

Pieza vertical 4:5 hiperrealista, calidad OpenAI GPT Image 2, estilo póster/carta coleccionable investigativa. Misma energía cinematográfica que la referencia: tormenta, rayos, humo, Buenos Aires/Obelisco de fondo, documentación sobre una mesa, pero en paleta verde esmeralda/negro en vez de rojo. Debe sentirse como "clean/verified/no lobby", no como placa barata.

Figura central fotorrealista de {p['name']} en traje/ropa formal, iluminación verde cinematográfica, alto contraste, glossy magazine cover, editorial político argentino. Agregar símbolos de verificación: sello "0", tilde/check, documentos auditados, luz verde, pero sin logos reales de medios.

Texto exacto y jerarquía:
Arriba pequeño: "LOBBY TRACKER ARGENTINA 🇦🇷"
Nombre grande: "{p['name'].upper()}"
Headline gigante: "$0"
Debajo: "{p['subtitle']}"
Etiqueta: "SIN ISRAEL LOBBY TOTAL"
Bullets abajo, blancos/verdes, condensados y legibles:
{bullets}
Footer izquierda: "MAY 2026"
Footer centro: "LOBBYTRACKER.AR"
Abajo derecha: dejar espacio para QR con label "ESCANEAR"

No inventar datos. No agregar acusaciones. No poner textos extra. No Canva, no vector, no cartoon. Hiperrealista, caro, potente, estilo cover de investigación.'''

def gen(p):
    out=OUT/f"{p['slug']}-green-gpt-image2-v1.png"
    payload={'model':'openai/gpt-5.4-image-2','modalities':['image','text'],'image_config':{'aspect_ratio':'4:5','image_size':'1K'},'messages':[{'role':'user','content':[{'type':'text','text':prompt(p)},{'type':'image_url','image_url':{'url':'data:image/jpeg;base64,'+ref_b64}}]}]}
    print('GENERATE',p['name'],flush=True)
    r=requests.post('https://openrouter.ai/api/v1/chat/completions',headers={'Authorization':'Bearer '+KEY,'Content-Type':'application/json'},json=payload,timeout=300)
    pathlib.Path(f'/tmp/{p["slug"]}_green_response.json').write_text(r.text)
    print('status',r.status_code,len(r.text),flush=True)
    r.raise_for_status()
    imgs=r.json().get('choices',[{}])[0].get('message',{}).get('images') or []
    if not imgs: print(r.text[:1000]); raise SystemExit(2)
    data=imgs[0]['image_url']['url'].split(',',1)[1]
    out.write_bytes(base64.b64decode(data))
    overlay_qr(out,p['qr'])
    print(out)

for p in people: gen(p)
