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['slide1'] = generate("Slide 1 - Cover", """Instagram carousel cover slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style.

Background gradasi dari soft cream (#FFF8F0) ke deep teal blue (#1A5F7A). Nuansa dark humor satir.

Ilustrasi: karakter duduk di tribun stadion, pake baju jersey dengan tulisan "MASALAH GUE" di punggung. Dia megang bendera besar bertuliskan "AKU SETIA." Di lapangan di depannya, ada MASALAH yang digambarkan seperti monster kecil yang sebenarnya gak gede-gede amat — tapi si karakter nontonin dengan serius, kadang nangis, kadang teriak "GAK ADIL!". Di sampingnya ada kursi kosong dengan tulisan "SOLUSI — GRATIS, TAPI LO MILIH GAK DATENG."

Teks HOOK besar font bold di bagian atas:
"SELAMAT!"

Teks hook lanjutan ukuran sama:
"LO RESMI JADI SUPORTER SETIA MASALAH LO SENDIRI"

Teks sub-heading di bawah:
"Lo tiap hari ngeluh soal masalah yang sama — tapi gak pernah lo selesaiin."
"Berarti lo supporter fanatik. Bukan orang yang mau berubah."

Desain bold striking dark humor, font besar mudah terbaca.""")

urls['slide2'] = generate("Slide 2 - Kenapa Gak Selesai-selesai", """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 di atas panggung, megang mikrofon, sinar lampu sorot ke dia. Di depannya ada banyak orang (teman-temannya) yang nonton dengan antusias. Di layar di belakang ada tulisan "EPISODE 104: KENAPA HIDUP GUE SULIT."

Di samping panggung, ada pintu kecil dengan tulisan "KELUAR (SOLUSI)." Tapi pintunya kecil, gak glamor. Gak ada lampu sorot. Gak ada penonton.

Karakter milih tetep di panggung — karena di panggung dia DILIHAT. Kalo dia ambil solusi, dia cuma orang biasa yang gak ada ceritanya.

Teks HEADLINE bold di atas:
"KENAPA MASALAH LO GAK SELESAI-SELESAI?"

Teks penjelasan:
"Bukan karena masalahnya berat. Tapi karena masalah itu udah jadi... CERITA LO."

Teks bullet:
"Curhat ke bestie = dapet perhatian."
"Post story galau = dapet simpati."
"Bikin thread Twitter = dapet validasi."

Teks bold orange:
"Masalah lo bukan beban. Masalah lo adalah PAKAN IDENTITAS."

Teks penutup:
"Kalo masalah selesai — lo kehilangan 'peran' lo. Terus lo jadi siapa?"

Desain infografis satir, nusuk.""")

urls['slide3'] = generate("Slide 3 - Secondary Gain", """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 berdiri di tengah, dari tubuhnya ada dua tangan. Satu tangan kiri megang masalah (digambar seperti rantai/kotak berat). Satu tangan kanan megang sesuatu yang HALUS — bentuknya hadiah/candy/perhatian (label: SIMPATI, VALIDASI, PERHATIAN, ALASAN).

Tangan yang megang rantai kelihatan berat — tapi tangannya erat. Tangan yang megang hadiah kelihatan ringan — tapi dia gak mau lepasin itu juga.

Visualisasi: dia gak bisa lepasin masalah karena masalah itu nyambung ke hadiah. Kalo masalah dilepas, hadiahnya ikut ilang.

Teks HEADLINE bold di atas:
"INI YANG NAMANYA SECONDARY GAIN"

Teks definisi:
"Secondary gain = keuntungan TERSEMBUNYI yang lo dapetin dari masalah lo sendiri."

Teks penjelasan:
"Lo pikir masalah lo cuma bikin lo susah? Salah."
"Masalah lo juga ngasih: perhatian dari orang, alasan buat gagal, identitas sebagai 'korban', kenyamanan untuk gak berubah."

Teks bold orange:
"Selama secondary gain-nya masih ada — masalah lo gak akan pernah beneran selesai."

Teks penutup:
"Bukan karena lo gak bisa. Tapi karena lo gak MAU — meskipun lo gak sadar."

Desain infografis dark insightful.""")

urls['slide4'] = generate("Slide 4 - Contoh Si Tukang Galau", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

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

Ilustrasi: karakter cewek duduk di kamar, HP di tangan, ngetik story IG dengan background gelap dan tulisan panjang galau. Di sekelilingnya ada notifikasi berdatangan: "LO KOKKUAT SIH" — "SEMANGAT YA" — "DIA GAK LAYAK BUAT LO" — "STAY STRONG."

Dia liat notifikasi satu-satu, senyum tipis. Di sampingnya ada jurnal dengan judul "CARA MOVE ON" — halaman pertama aja, sisanya kosong. Di sebelah jurnal ada HP lain dengan chat temen yang bilang "LO UDAH COBA TERAPI BELOM?" — di-read aja, gak dibales.

Di atas, ada gelembung pikiran: "Kalo gue move on... gue gak bisa posting galau lagi. Terus gue dapet perhatian dari mana?"

Teks HEADLINE di atas:
"CONTOH: SI TUKANG GALAU"

Teks penjelasan:
"Bukan gak bisa move on. Tapi peran 'si patah hati' itu ENAK. Dapet simpati, dapet perhatian, dapet alasan buat gak produktif."

Teks penutup:
"Kalo lo udah move on... lo cuma orang biasa. Gak ada yang nanyain kabar lo tiap hari."

Desain komik relatable nusuk.""")

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