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 4 - Makan", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style. Background gradasi soft cream ke deep teal blue. Aksen orange.

Ilustrasi: seorang karakter duduk di sofa lagi makan keripik sambil pegang HP di sampingnya ada tumpukan bungkus camilan kosong gelembung pikiran menunjukkan karakter lagi asyik nonton film. Ekspresi kaget pas sadar bungkusnya udah banyak. Style flat minimalis.

Teks hook besar font bold di atas: NGEMIL SAMBIL NONTON? LUPA UDAH MAKAN BERAPA?

Teks konten di bawah: Bawah sadar yang gerakin tangan. Sadar sibuk nonton. Ini namanya mindless eating. Desain bersih font gede.""")

generate("Slide 5 - First Impression", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style. Background gradasi soft cream ke deep teal blue. Aksen orange.

Ilustrasi: dua karakter baru bertemu salah satu ekspresi mikir dengan tanda tanya dan jam dinding kecil menunjukkan 7 detik. Gelembung di kepala menunjukkan penilaian instan. Style flat minimalis.

Teks hook besar font bold di atas: 7 DETIK PERTAMA BERTEMU OTAK UDAH NILAI ORANG

Teks konten di bawah: Bawah sadar berdasar pengalaman dan pola masa lalu. Makanya kadang gak suka seseorang tanpa alasan jelas. Desain bersih font gede.""")

generate("Slide 6 - Trigger Emosi", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style. Background gradasi soft cream ke deep teal blue. Aksen orange.

Ilustrasi: seorang karakter duduk dengan headphone di sekelilingnya ada ikon lagu ikon hidung dan ikon foto lama semuanya memancarkan sinar ke arah karakter yang ekspresinya tiba-tiba sedih. Style flat minimalis.

Teks hook besar font bold di atas: ADA LAGU YANG BIKIN TIBA-TIBA SEDIH?

Teks konten di bawah: Atau bau tertentu ingetin masa kecil? Itu memori bawah sadar yang ke-trigger tanpa kamu izin. Bawah sadar nyimpen SEMUA. Desain bersih font gede.""")

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. Aksen orange hangat.

Ilustrasi: dua karakter saling berhadapan satu karakter memberikan sebuah kunci ke karakter lain yang menerimanya dengan senyum. Simbol kunci melambangkan kendali. Style flat minimalis.

Teks besar font bold di bagian atas: BAWAH SADAR ITU GAK JAHAT

Teks ukuran medium di tengah: Dia cuma setia sama program yang pernah kamu kasih.

Teks hook penutup di bawah: Kamu bisa ubah program itu. Pelan-pelan. Konsisten.

Teks kecil di pojok bawah: Follow balimentari

Desain closing hangat memotivasi font besar jelas.""")

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