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['slide5'] = generate("Slide 5 - People Pleaser", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

Background gradasi soft cream ke deep teal blue.

Ilustrasi: Karakter di tengah dikelilingi banyak orang yang ngomong bersamaan: TOLONG YA, MAU YA, BISA YA, JEMPUT GUE YA. Dari mulut karakter keluar RESPONS OTOMATIS: IYA IYA IYA IYA semua serentak.

Di dalam kepalanya transparan ada pabrik kecil dengan 3 mesin:

Mesin 1 ikon hati retak: TAKUT DITOLAK Kalo gue nolak gue gak disukai. Dari masa kecil dimarahin pas nolak.

Mesin 2 ikon kunci: KONFLIK MENGERIKAN Lebih gampang iya-in daripada berantem.

Mesin 3 ikon topeng tersenyum: IDENTITAS ANAK BAIK Gue dikenal sebagai enak diajak. Sayang kalo rusak reputasi.

Di bawah ada kesimpulan: PEOPLE PLEASING BUKAN BAIK. People pleasing itu TAKUT.

Teks HEADLINE di atas:
KENAPA LO JADI PEOPLE PLEASER?

Teks penjelasan:
Bukan cuma kena Yes Set dari orang lain. Lo juga punya Yes Set ke DIRI SENDIRI lo terlatih sejak kecil buat iya-in.

Teks penutup:
Orang baik bilang IYA dengan SADAR. People pleaser bilang IYA karena TAKUT.

Desain komik dark insight nusuk.""")

urls['slide6'] = generate("Slide 6 - Cara Keluar", """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 yang sama dari slide 1. Mulutnya mau bilang IYA lagi tapi kali ini dia PAUSE. Ada tangan yang MENAHAN mulutnya sendiri. Di atas kepala ada lampu menyala AHA MOMEN.

4 langkah:

Langkah 1 ikon jeda: PASANG JEDA Sebelum jawab tarik napas 3 detik. Momentum Yes Set cuma bisa berjalan kalo lo spontan. Jeda break momentumnya.

Langkah 2 ikon tanya: TANYA BALIK Boleh aku pikir dulu atau Emangnya kenapa. Lo gak harus langsung jawab. Lo punya hak buat mikir.

Langkah 3 ikon hati: CEK ISI HATI Kalo gue bilang GAK sekarang apa yang gue takutin? Kenapa gue takut nolak?

Langkah 4 gabungan: JAWAB BARU Setelah jeda tanya balik cek hati baru lo jawab. Kalo IYA itu IYA yang SADAR. Kalo GAK jujur aja.

Teks HEADLINE di atas:
CARA KELUAR DARI YES SET

Teks penutup:
IYA yang SADAR itu kuat. IYA karena momentum bikin lo capek sendiri.

Desain infografis actionable.""")

urls['slide7'] = 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.

Ilustrasi: karakter yang sama sekarang berdiri tegak. Di depannya ada orang yang minta tolong lagi tapi kali ini karakter gak langsung ngangguk. Ada jeda visualisasi: balon jawaban dia menggantung bukan IYA bukan GAK tapi TUNGGU. GUE PIKIR DULU.

Di sampingnya daftar bekas IYA dari slide 1 udah dicoret-coret habis. Ada daftar baru:

IYA karena emang mau centang.
GAK karena emang gak bisa centang.
BANTU separo aja centang.

Karakter tersenyum bukan senyum paksaan tapi senyum LEGA.

Teks HEADLINE besar font bold di bagian atas:
IYA YANG SADAR. BUKAN IYA YANG OTOMATIS.

Teks body medium:
Lo gak harus selalu IYA buat jadi orang baik.

Teks hook penutup:
Lo cukup berhenti sejenak. Dan pilih: jawaban apa yang beneran PUNYA LO?

Teks closing:
Mulai sekarang pause dulu. Baru jawab. ikon tanaman

Teks CTA pojok bawah:
Follow balimentari

Teks kecil di atas CTA:
Tag temen yang gak pernah bisa nolak

Desain closing empowering tegas tapi hangat.""")

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