import json, urllib.request, time, sys

API_KEY = "vio_sk_vA8llIYm51J3oyXtfevrM92yUBJ8-3IS1sIn6xydF8o"
BASE = "https://api.viostudio.id/v1"

def generate(slide_name, prompt):
    payload = {"prompt": prompt, "model": "gpt-image-2.0", "aspect_ratio": "3:4", "count": 1}
    print(f"\n🎨 {slide_name}...")
    sys.stdout.flush()
    for attempt in range(3):
        try:
            req = urllib.request.Request(f'{BASE}/images/generate',
                data=json.dumps(payload).encode(),
                headers={'Content-Type':'application/json','Authorization':f'Bearer {API_KEY}','User-Agent':'Mozilla/5.0'},
                method='POST')
            with urllib.request.urlopen(req, timeout=60) as resp:
                gen_id = json.loads(resp.read()).get('generation_ids',[0])[0]
                print(f"✅ Queued ID: {gen_id}")
                sys.stdout.flush()
                for i in range(30):
                    time.sleep(8)
                    try:
                        sr = urllib.request.Request(f'{BASE}/generations/{gen_id}',
                            headers={'Authorization':f'Bearer {API_KEY}','User-Agent':'Mozilla/5.0'})
                        with urllib.request.urlopen(sr, timeout=20) as s:
                            st = json.loads(s.read())
                            stat = st.get('status')
                            print(f"  ({i+1}/30) {stat}")
                            sys.stdout.flush()
                            if stat == 'completed':
                                print(f"✅ {slide_name} DONE!\n📸 {st.get('asset_url')}")
                                return
                            elif stat == 'failed':
                                print(f"❌ FAILED: {st.get('error_message')}")
                                return
                    except:
                        time.sleep(5)
        except Exception as e:
            print(f"  ⚠️ Retry {attempt+1}/3... ({e})")
            time.sleep(5)

generate("Slide 5 - Kenapa Bahagia Cepet Ilang", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis.

Background gradasi soft cream ke deep teal blue.

Ilustrasi perbandingan visual dua sisi:

Kiri: Tangan menuang air berwarna emas hangat dari teko kecil dengan label MOMEN BAHAGIA ke dalam gelas. Gelasnya bocor air terus tumpah keluar dari beberapa lubang kecil. Gelas tetap kosong. Ada ikon panah melingkar hedonic adaptation.

Kanan: Batu hitam besar dengan label TRAUMA diletakkan di gelas berbeda yang kokoh gak bocor gak tumpah tetap penuh. Ada ikon gembok.

Teks HEADLINE bold di atas:
KENAPA KEBAHAGIAAN CEPET ILANG?

3 poin vertikal dengan bullet:
1. Hedonic adaptation setelah dapet kita terbiasa dan pengen lagi.
2. Otak gak anggap bahagia info penting buat survival.
3. Trauma data prioritas Bahagia bonus.

Teks highlight bold orange:
1 kritik nempel 1 minggu. 10 pujian ilang 1 jam.

Desain infografis step-by-step rapi.""")

generate("Slide 6 - Solusi", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style step-by-step infografis.

Background gradasi soft cream ke deep teal blue lebih terang dan hangat dari slide sebelumnya. Aksen orange.

Ilustrasi 3 langkah vertikal masing-masing dengan ikon.

Langkah 1 atas: ikon jaring menangkap kupu-kupu atau sinar melambangkan TANGKAP MOMEN BAIK. Ada karakter kecil yang tersenyum sadar pas lagi happy.

Langkah 2 tengah: ikon folder buku dengan label KOTAK BUKTI POSITIF. Momen baik sinar kecil dimasukkan ke dalam folder. Ada pena kecil untuk jurnal.

Langkah 3 bawah: timbangan mulai seimbang. Sisi kiri batu trauma masih ada tapi lebih kecil. Sisi kanan tumpukan batu kecil positif udah mulai banyak dan hampir seimbang. Karakter duduk di samping tersenyum tenang.

Teks HEADLINE bold di atas:
CARA NGIMBANGIN

3 step dengan angka:
1. TANGKAP sadarin pas lagi happy.
2. SIMPAN tulis jurnal atau cerita ngomong nge-record ulang.
3. ULANG review catetan tiap minggu biasakan otak ini juga penting.

Teks penutup medium:
Butuh usaha sadar. Tapi lama-lama timbangannya seimbang.

Desain warm memotivasi.""")

generate("Slide 7 - Closing", """Instagram carousel closing slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style.

Background gradasi soft cream ke deep teal blue hangat dan terang. Aksen orange halus.

Ilustrasi: timbangan yang sekarang SEIMBANG. Sisi kiri batu trauma masih ada tapi udah lebih kecil ada retak tipis menandakan udah diproses. Sisi kanan kumpulan batu kecil positif yang jumlahnya banyak dan berwarna hangat timbangan seimbang sempurna.

Di samping timbangan seorang karakter duduk bersila di lantai wajah tenang senyum tipis memegang buku catatan kecil. Ada sinar hangat dari atas. Lingkungan damai.

Teks HEADLINE besar font bold di bagian atas:
TRAUMA GAK AKAN PERNAH ILANG SEPENUHNYA

Teks body medium di tengah:
Tapi kamu bisa bikin dia gak jadi SATU-SATUNYA yang nyetir hidupmu.

Teks hook penutup:
Setiap momen baik yang kamu sadari catat dan ingat itu data baru buat otakmu.

Teks closing:
Pelan-pelan. Konsisten.

Teks CTA pojok bawah:
Follow balimentari

Desain closing hangat damai memotivasi font besar mudah dibaca.""")

print("\n✅ BATCH 5-7 COMPLETE!")
