import json, urllib.request, time, sys

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

urls = {}

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 st.get('asset_url')
                            elif stat == 'failed':
                                print(f"❌ FAILED: {st.get('error_message')}")
                                return None
                    except:
                        time.sleep(5)
        except Exception as e:
            print(f"  ⚠️ Retry {attempt+1}/3... ({e})")
            time.sleep(5)

urls['slide5'] = generate("Slide 5 - Belanja Impulsif", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

Background gradasi soft cream ke deep teal blue.

Ilustrasi karakter baru checkout barang mahal di HP sepatu limited edition. Notifikasi Transaksi berhasil Rp 2.500.000.

Di sampingnya ada kalender dan grafik TARGET TABUNGAN BULAN INI Rp 3.000.000. Grafik tabungan turun drastis.

Karakter liat dompet. Liat sepatu. Ada momen jeda cognitive dissonance hit. Ekspresi cemas sesaat.

Tapi kemudian gelembung rasionalisasi:
1. Ini investasi sepatu limited bisa naik harga.
2. Murah dibanding yang dijual temen gue.
3. Gue udah kerja keras deserve ini.
4. Diskon 10 persen Rugi kalo gak beli.
5. Besok gue hemat gak jajan sebulan.

Di pojok otak kecil angkat jempol. Fixed Keyakinan baru ini investasi.

Teks HEADLINE di atas:
CONTOH 2: BELANJA IMPULSIF VS TABUNGAN

Teks penutup bawah:
Otak Kita punya target nabung.
Tangan checkout sepatu 2.5 juta
Otak Oke gue bikinin 5 alasan kenapa ini keputusan bijak.

Desain komik relatable lucu.""")

urls['slide6'] = generate("Slide 6 - Toxic Relationship", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

Background gradasi soft cream ke deep teal blue.

Ilustrasi dua karakter satu A duduk masam nyebelin diam di HP gak peduli. Satu lagi B duduk di samping dengan ekspresi sedih tapi masih bertahan.

Gelembung pikiran B:
Kenapa gue masih di sini?

Lalu di bawahnya otak kecil muncul dengan cepat memberikan 6 kartu rasionalisasi:
1. Dia keras karena sayang.
2. Semua hubungan ada masalahnya.
3. Dia cuma lagi stres. Nanti baik lagi.
4. Kalo gue tinggalin gue sendirian.
5. Gue udah investasi 3 tahun. Sayang.
6. Paling gue yang terlalu sensitif.

Kartu ke-6 yang paling mencemaskan menyalahkan diri sendiri.

Teks HEADLINE di atas:
CONTOH 3: BERTAHAN DI TOXIC RELATIONSHIP

Teks penutup bawah:
Otakmu bisa bikin pelaku toxic keliatan kayak pahlawan demi ngehindarin rasa sakit KEHILANGAN.
Ini bukan kamu bodoh. Ini otakmu yang panik.

Desain komik eye-opening ngena.""")

urls['slide7'] = generate("Slide 7 - Closing", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style split infografis closing.

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

Ilustrasi split dua bagian:

Bagian kiri SADARI nuansa hangat: Karakter duduk di meja jurnal di tangan lampu menyala. Di tembok ada sticky notes: Apa yang aku percaya? Apa yang aku lakuin? Di mana kontradiksinya? Apa alasan yang aku bikin? Karakter tersenyum kecil baru sadar.

3 step vertikal:
1. TANYA Apa yang aku percaya vs apa yang aku lakuin?
2. DETEKSI Pas kontradiksi muncul apa alasan yang langsung aku bikin?
3. JURNAL Tulis rasionalisasimu. Bacain lagi. Lucu kan?

Bagian kanan CLOSING: Karakter sama sekarang duduk santai di kursi dengan pemandangan luas. Kepingan puzzle di tangan udah cocok keyakinan dan tindakan SELARAS.

Teks di bawah:
Kamu gak harus selalu bener. Tapi kamu bisa selalu JUJUR.

Teks closing:
Sadari kontradiksimu. Itu langkah pertama untuk SELARAS. ikon tanaman

Teks CTA pojok bawah:
Follow balimentari

Teks kecil di atas CTA:
Tag temen yang jago ngerasionalisasi

Desain split warm memotivasi.""")

print("\n✅ BATCH 2 COMPLETE!")
print("\nURLs:", json.dumps(urls, indent=2))
