#!/usr/bin/env python3
"""Re-analisis 4 gambar bermasalah (27, 42, 68, 70) — prompt ketat, Bahasa Indonesia bersih."""
import base64, json, io, os, sys, time, urllib.request, urllib.error
from PIL import Image

ROOT = "leit_ig_40"
OUT_DIR = os.path.join(ROOT, "captions")
key = open("/home/mantapman/.openrouter_key").read().strip()

TARGETS = [27, 42, 68, 70]

PROMPT = """Lihat gambar ini dengan teliti. Ini materi feed Instagram/Facebook LEIT (Leadership-English Institute — kursus bahasa Inggris di Surabaya).

Tulis dalam Bahasa Indonesia yang BERSIH dan ALAMI (jangan campur bahasa asing yang tidak perlu, jangan typo, jangan ngawur).

Format jawaban EXACT:

[DESKRIPSI]
3-4 kalimat deskripsi isi gambar: visual, teks yang terbaca di gambar, tema/topiknya.

[CAPTION]
Caption 2 paragraf (wajib 2 paragraf, pisah dengan baris kosong). Bahasa Indonesia humanis, hangat, gaya feed IG/FB. Paragraf 1: hook menarik yang nyambung ke isi/tema gambar. Paragraf 2: keunggulan LEIT + CTA jelas (ajakan daftar/kontak). Gunakan info LEIT: speaking & semua skill dilatih, kelas kecil pembinaan maksimal, hasil terukur. Kontak: WA Surabaya Timur 0811 331 700, Surabaya Barat 0811 396 488. JANGAN mulai dengan "Terima kasih". Total maksimal 500 karakter.

[HASHTAG]
7-8 hashtag relevan dalam satu baris, selalu mulai dengan #LEIT #LEITSurabaya #KursusBahasaInggris lalu tag tematik sesuai gambar. Hashtag harus kata yang benar (jangan typo)."""


def analyze(num, path, model):
    im = Image.open(path).convert("RGB")
    im.thumbnail((700, 700))
    buf = io.BytesIO()
    im.save(buf, "JPEG", quality=80)
    b64 = base64.b64encode(buf.getvalue()).decode()
    payload = {
        "model": model,
        "messages": [{"role": "user", "content": [
            {"type": "text", "text": PROMPT},
            {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64}"}}
        ]}],
        "max_tokens": 700
    }
    req = urllib.request.Request(
        "https://openrouter.ai/api/v1/chat/completions",
        data=json.dumps(payload).encode(),
        headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
    )
    with urllib.request.urlopen(req, timeout=180) as resp:
        data = json.loads(resp.read().decode())
        return data["choices"][0]["message"]["content"]


MODELS = [
    "google/gemma-4-26b-a4b-it:free",
    "nvidia/nemotron-nano-12b-v2-vl:free",
    "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free",
]

for n in TARGETS:
    folder = "27-40" if n <= 40 else "41-50" if n <= 50 else "51-60" if n <= 60 else "61-77"
    path = os.path.join(ROOT, folder, f"{n}.png")
    out_file = os.path.join(OUT_DIR, f"{n}.json")
    ok = False
    for model in MODELS:
        for attempt in range(3):
            try:
                print(f"=== {n}.png ({model}, try {attempt+1}) ===", flush=True)
                text = analyze(n, path, model)
                if len(text) < 300 or "ERROR" in text[:50]:
                    raise ValueError("Hasil terlalu pendek/error")
                json.dump({"num": n, "file": f"{n}.png", "analysis": text}, open(out_file, "w"), ensure_ascii=False)
                print(f"  ✅ OK ({len(text)} chars)", flush=True)
                ok = True
                break
            except urllib.error.HTTPError as e:
                body = e.read().decode()[:150]
                print(f"  HTTP {e.code}: {body}", flush=True)
                if e.code == 429:
                    time.sleep(15 + attempt * 10)
                else:
                    break
            except Exception as e:
                print(f"  ERR: {e}", flush=True)
                time.sleep(8)
        if ok:
            break
    if not ok:
        print(f"  ❌ {n}.png GAGAL SEMUA MODEL", flush=True)
    time.sleep(3)

print("\nSelesai re-analisis 4 gambar.")
