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 5 - Mekanismenya", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis.

Background gradasi soft cream ke deep teal blue. Nuansa agak gelap untuk feel lebih serius.

Ilustrasi: otak manusia dari samping dengan area amigdala dan hippocampus disorot. Dari amigdala keluar sinyal ALARM merah mengarah ke folder besar berlabel DATABASE TRAUMA — folder itu penuh dengan file lama ikon halaman kertas dengan label seperti diejek SD, ditolak orang tua, dikhianati mantan.

Di depan database ada FILTER yang rusak berantakan — seharusnya menyaring tapi malah bocor. Label filter: HARUSNYA: ini berbeda. Tapi bocor dan mengalir ke panah merah besar yang keluar dari otak menuju ke reaksi marah.

Teks HEADLINE bold di atas:
KENAPA INI TERJADI?

Teks step-by-step di bawah:
1. Situasi sekarang memicu kenangan lama (trigger).
2. Bawah sadar deteksi: INI SAMA — BAHAYA!
3. Filter otak rusak — gak bisa bedakan dulu vs sekarang.
4. Kamu marah ke orang yang gak salah.
5. Orang itu bingung. Kamu makin emosi. Circle of chaos.

Teks penutup bold:
Dan siklus ini diulang terus tanpa kamu sadari.

Desain infografis rapi serius.""")

generate("Slide 6 - Cara Stop", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style step-by-step infografis.

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

Ilustrasi: karakter duduk tenang memegang secarik kertas seperti sedang journaling. Di atas kertas ada 4 pertanyaan. Di sampingnya ada proyektor yang tadinya menyala sekarang dimatikan dan ada penutup lensanya. Cahaya hangat dari samping. Style flat minimalis.

Teks HEADLINE di atas:
CARA STOP PROJECTION

4 step vertikal dengan ikon:

1. (ikon jeda) PAUSE — Pas marah meledak, tanya: Tunggu, aku marah ke dia atau ke siapa?

2. (ikon kaca pembesar) CEK — Emosi ini pernah aku rasain sebelumnya kapan? Sama siapa?

3. (ikon label) BEDAIN — Sadari: orang di depanku bukan pelaku aslinya. Ini situasi BERBEDA.

4. (ikon bicara) KOMUNIKASI — Bilang: Aku lagi ke-trigger sesuatu dari masa lalu. Bukan kamu.

Teks penutup:
Projection ilang bukan karena kamu berhenti marah — tapi karena kamu SADAR.

Desain warm step-by-step memotivasi.""")

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 halus.

Ilustrasi: karakter yang tadinya marah sekarang duduk bersila tenang. Di depannya: proyektor ditutup, layar kosong. Di belakang karakter ada bayangan versi kecil dirinya anak inner child yang duduk di samping, tidak lagi menunjuk-nunjuk. Keduanya tenang. Ada jendela dengan cahaya hangat masuk. Style flat minimalis.

Teks HEADLINE besar font bold di bagian atas:
KAMU MARAH. ITU MANUSIA.

Teks body medium di tengah:
Tapi kamu juga manusia yang bisa SADAR.

Teks hook penutup:
Tiap kali kamu mau marah — jeda.
Tanya: aku marah ke dia... atau ke masa lalu?

Teks closing:
Begitu kamu sadar, projection kehilangan kuasanya.

Teks CTA pojok bawah:
Follow balimentari

Teks kecil di atas CTA:
Share ke temen yang suka sensi

Desain closing hangat damai memotivasi.""")

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