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 - Contoh Si Korban Karir", """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 duduk di meja kerja, laptop terbuka. Di depannya ada daftar "ALASAN KENAPA GUE GAK SUKSES":

- Bos gak adil.
- Ekonomi lagi jelek.
- Gak punya koneksi.
- Orang tua gak kaya.
- Beruntung gak berpihak.
- Sekolah gak ngajarin ini.

Daftarnya panjang — udah kayak resume tapi versi "alasan gagal." Di sampingnya, ada temen yang nunjuk ke HP dengan tulisan "LO UDAH COBA IKUT KURSUS ONLINE?" — karakter gak liat. Temennya nunjuk lagi "LO UDAH COBA MINTA MENTOR?" — karakter tetep gak liat.

Di pojok, ada gelembung pikiran: "Kalo gue sukses... gue gak bisa nyalahin orang lain lagi. Terus gue jadi siapa?"

Teks HEADLINE di atas:
"CONTOH: SI KORBAN KARIR"

Teks penjelasan:
"Bukan gak bisa sukses. Tapi peran 'korban sistem' itu NYAMAN. Gak perlu tanggung jawab. Gak perlu ambil resiko."

Teks penutup:
"Kalo lo sukses... siapa yang lo salahin nanti?"

Desain komik relatable nusuk.""")

urls['slide6'] = generate("Slide 6 - Cara Sadar dan Keluar", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis.

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

Ilustrasi: karakter yang sama dari slide 1, sekarang turun dari tribun. Jersey "MASALAH GUE" udah dilepas. Dia berdiri di antara dua jalur. Satu jalur balik ke tribun ada tanda nyaman hangat. Satu jalur ke lapangan ada tanda penuh teka-teki.

Di atas, 3 langkah:

Langkah 1 (ikon cermin): AKUIN SECONDARY GAIN-MU. Tanya jujur: Apa enaknya punya masalah ini? Perhatian? Validasi? Alasan buat gagal? Sadari dulu baru bisa lepas.

Langkah 2 (ikon gunting): PISAHIN MASALAH DARI IDENTITAS. Lo BUKAN masalah lo. Lo punya masalah. Beda. Kalo lo = masalah, lo gak bisa lepas karena lo ilang. Kalo lo punya masalah — lo bisa selesaiin.

Langkah 3 (ikon jalan): PILIH PAPAN: SUPORTER ATAU PEMAIN? Di tribun enak tapi gak maju. Di lapangan capek tapi lo yang main. Pilih.

Teks HEADLINE di atas:
"CARA SADAR DAN KELUAR DARI JEBakan INI"

Teks penutup:
"Gak ada yang salah jadi supporter. Tapi jangan pura-pura jadi pemain."

Desain infografis tegas motivating.""")

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

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

Ilustrasi: karakter yang sama, sekarang pake jersey baru — polos, tanpa tulisan. Dia berdiri di tengah lapangan (bukan tribun). Di tangannya ada bola. Di tribun, orang-orang yang dulu nontonin dia — sekarang bubar. Gak ada penonton. Gak ada tepuk tangan. Cuma dia dan lapangan.

Dia tersenyum.

Di pojok tribun, ada jersey lama dengan tulisan "MASALAH GUE" terlipat rapi — udah gak dipake lagi.

Teks HEADLINE besar font bold di bagian atas:
"LO MAU JADI SUPORTER APA PEMAIN?"

Teks body medium:
"Kalo lo pilih jadi pemain — gak ada penonton yang tepuk tangan. Gak ada story IG. Gak ada simpati."

Teks hook penutup:
"Tapi ada SATU hal yang lo dapet: HIDUP LO KEMBALI."

Teks closing:
"Turun dari tribun. Masuk ke lapangan. Mulai main. ikon tanaman"

Teks CTA pojok bawah:
"Follow balimentari"

Teks kecil di atas CTA:
"Tag temen yang jago jadi supporter setia masalahnya sendiri 😬"

Desain closing empowering, tegas tapi hangat.""")

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