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 slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style modern minimalis.

Background gradasi dari soft cream (#FFF8F0) ke deep teal blue (#1A5F7A). Aksen orange (#FF9F43).

Ilustrasi: seorang karakter berdiri di depan cermin besar, ngomong sesuatu ke bayangannya sendiri. Tapi bayangan di cermin melakukan facepalm tangan di muka ekspresi frustrasi. Celah retak di cermin. Style flat vector minimalis.

Teks hook besar font bold di bagian atas dengan tanda tanya:
"KENAPA AFIRMASI GAK SELALU WORK?"

Teks sub di bawah ukuran medium yang relate:
"Udah ngomong baik-baik sama diri sendiri, tapi kok gak berasa?"

Desain bold striking font besar dan mudah terbaca.""")

generate("Slide 2 - Masalahnya", """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.

Ilustrasi: gambar otak dibagi dua belahan. Belahan kiri label SADAR dengan ikon lampu dan emblem check. Belahan kanan label BAWAH SADAR dengan ikon gembok terkunci dan setumpuk folder data. Dari kiri ada panah afirmasi masuk tapi mentok di batas antara sadar dan bawah sadar yang seperti tembok kaca. Style flat minimalis.

Teks headline di atas:
"AFIRMASI MASUK SADAR DOANG"

Teks penjelasan di bawah:
"Bawah sadar bilang: Bohong lo. Data lama lo bilang sebaliknya."

Font besar jelas.""")

generate("Slide 3 - The Gap", """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.

Ilustrasi: dua gelombang otak berbeda. Gelombang pertama rapat dan cepat label BETA sadar aktif. Gelombang kedua panjang dan lambat label THETA DELTA bawah sadar relaks. Di antaranya ada jurang/celah besar dengan tulisan GAP. Ada karakter kecil yang lompat dari satu sisi ke sisi lain tapi jatuh. Style flat minimalis.

Teks headline di atas:
"FREKUENSINYA BEDA"

Teks penjelasan di bawah:
"Afirmasi di frekuensi beta sadar penuh. Keyakinan lama di theta delta bawah sadar. Jadinya omongan baru vs data lama ya menang data lama."

Font besar jelas.""")

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