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 1 - Cover", """Instagram carousel cover slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style modern minimalis aesthetic.

Background gradasi dari soft cream (#FFF8F0) ke deep teal blue (#1A5F7A) dengan gradasi horizontal. Aksen orange (#FF9F43) terbatas untuk elemen dekoratif kecil.

Ilustrasi utama di tengah: sebuah timbangan kuno besar gaya vintage simple. Sisi kiri timbangan satu batu besar berwarna gelap abu-abu dengan retak-retak label kecil 1 TRAUMA posisi sangat rendah karena berat. Sisi kanan timbangan sepuluh batu kecil berwarna pink emas muda label PUJIAN posisi melambung tinggi karena ringan walaupun jumlahnya banyak tetap gak bisa ngimbangin. Tidak seimbang dramatis.

Background split sisi kiri trauma lebih gelap dengan bayangan. Sisi kanan pujian lebih terang.

Teks HOOK besar font bold sans-serif ukuran sangat besar di bagian atas warna teal gelap:
KENAPA TRAUMA LEBIH NEMPEL

Teks HOOK lanjutan di bawah ukuran sama besar:
DARI KEBAHAGIAAN?

Teks sub-heading ukuran medium di bawah hook:
1 kejadian buruk lebih besar dari 10 momen baik kok bisa?

Elemen dekoratif minimal. Desain bold striking font besar mudah terbaca.""")

generate("Slide 2 - Negativity Bias", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis minimalis.

Background gradasi soft cream ke deep teal blue. Aksen orange pada elemen penting.

Ilustrasi utama: gambar otak manusia dari samping style flat simple icon. Di dalam otak bagian amigdala bentuk kacang almond kecil disorot dengan lingkaran cahaya. Dari amigdala satu panah merah BESAR dengan label BAHAYA mengarah ke area memori. Satu panah hijau KECIL dengan label AMAN juga mengarah ke area memori. Panah merah 3x lebih besar dan terang dari panah hijau.

Di pojok ada ikon evolusi sederhana manusia purba kecil lari dari harimau.

Teks HEADLINE font bold besar di atas:
ADA YANG NAMANYA NEGATIVITY BIAS

Teks konten di bawah:
Otak kita dirancang untuk SELAMAT bukan BAHAGIA.

Dulu yang lupa nikmatnya buah gapapa.
Yang lupa bahayanya harimau MATI.

Teks penutup bawah bold ukuran medium:
Makanya otak lebih awet nyimpen trauma.

Desain bersih rapi garis pemisah tipis antara teks dan ilustrasi.""")

generate("Slide 3 - Mekanisme Trauma", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik infografis.

Background gradasi soft cream ke deep teal blue.

Ilustrasi komik 2 bagian split panel.

Panel kiri kecil: seorang anak kecil jatuh dari sepeda lutut berdarah ekspresi kaget sakit. Dari momen ini keluar garis-garis energi merah oranye yang melesat ke kanan.

Panel kanan besar: gambar otak dengan dua folder. Folder pertama sangat besar menonjol ada gembok ekstra dan label DATA BERBAHAYA PRIORITAS TINGGI. Ada panah merah dari panel kiri masuk ke folder ini. Folder kedua lebih kecil polos label DATA BIASA. Ikon tambahan mata merekam visual telinga merekam suara hidung merekam bau semuanya mengarah ke folder prioritas tinggi.

Teks HEADLINE font bold di atas panel:
KENAPA KEJADIAN BURUK NEMPEL BANGET?

Teks narasi di bawah ilustrasi:
Otak ngasih label INI PENTING INGAT BAIK-BAIK SUPAYA JANGAN TERULANG.

Setiap trauma otak rekam DETAIL bau suara warna suhu.

Teks peringatan bold ukuran medium:
Masalah otak gak bisa bedain trauma 10 tahun lalu vs ancaman sekarang.

Desain infografis komik rapi font jelas.""")

generate("Slide 4 - Contoh Nyata", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik strip.

Background gradasi soft cream ke deep teal blue.

Ilustrasi kilas balik dua bagian:

Bagian atas masa lalu nuansa lebih gelap sepia: seorang anak SD laki-laki atau perempuan berdiri di depan papan tulis muka merah diejek teman-teman tertawa guru geleng-geleng kepala. Ada efek visual FLASHBACK garis putus-putus sebagai transisi.

Bagian bawah masa kini nuansa normal warna hangat: seorang dewasa berdiri di depan panggung presentasi kantor keringat dingin tetes keringat digambar tangan gemetar jantung mau copot ikon jantung dengan garis panik. Gelembung pikirannya menampilkan kilasan dari kejadian SD di atas.

Teks HEADLINE di antara dua panel:
CONTOH NYATA

Teks penjelasan di bawah ilustrasi:
Diejek pas presentasi SD sekarang umur 25 presentasi kantor gemeteran.

Otakmu INI SITUASI BERBAHAYA INI SAMA! PADAHAL BEDA.

Tapi otak gak peduli.

Desain komik strip font teks balon dialog mudah dibaca.""")

print("\n✅ BATCH 1-4 COMPLETE!")
