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 - Lebih Banyak Reframe", """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: 4 panel kecil berderet kayak galeri reframe:

Panel 1: Kata SENDIRI berubah jadi MERDEKA. Karakter dari sendirian di pojok kosan jadi berdiri di puncak gunung menikmati pemandangan. Label: SENDIRI → MERDEKA.

Panel 2: Kata CEREWET berubah jadi PERHATIAN. Ibu yang tadinya ngomel digambar ulang dengan latar penuh love. Label: CEREWET → PERHATIAN.

Panel 3: Kata SOK TAU berubah jadi PENASARAN. Orang yang tadinya nyebelin jadi karakter yang excited belajar. Label: SOK TAU → PENASARAN.

Panel 4: Kata MUNDUR berubah jadi NGAKALIN. Karakter yang tadinya jalan mundur sekarang jalan mutar cari celah lain. Label: MUNDUR → NGAKALIN.

Di tengah semua panel, teks besar: INI BUKAN BOHONG. Ini LENSA BARU.

Teks HEADLINE bold:
REFRAIM #3 SAMPAI #6: KOLEKSI LENGKAP

Teks penutup:
Realitanya gak berubah. Tapi artinya berubah total. Dan ARTILAH yang lo rasain — bukan realitanya.

Desain galeri infografis mind-blowing.""")

urls['slide6'] = generate("Slide 6 - Gimana Cara Reframe", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis actionable.

Background gradasi soft cream ke deep teal blue. Aksen orange.

Ilustrasi: Karakter duduk, di depannya ada papan tulis kecil. Di papan tulis ada satu kata yang bikin dia stress: BOSAN.

Lalu 3 langkah praktis:

Langkah 1 (ikon tanya): SADARIN KATA LO. Lo ngomong apa ke diri sendiri? Gue BOSAN. Gue DEPRESI. Gue GAGAL. Tulis kata itu. Lihat. Sadari.

Langkah 2 (ikon otak dengan lampu): TANYA: ADA GAK KATA LAIN? BOSAN = Lagi butuh tantangan. DEPRESI = Lagi proses healing. GAGAL = Udah nyoba sesuatu yang BERANI. Cari kata yang TETEP JUJUR tapi bikin lo BERGERAK — bukan bikin lo DIAM.

Langkah 3 (ikon mulut): PAKE KATA ITU. Bukan cuma di kepala. Omongin. Tulis. Dengerin diri sendiri pake kata baru itu. Ulang-ulang.

Di bawah, teks kuning: Gak usah ribet. Cukup satu kata. Yang penting KONSISTEN.

Teks HEADLINE bold di atas:
GIMANA CARA REFRAIM?

Teks penutup:
Lo udah reframe ribuan kali tanpa sadar. Gagal jadi belajar. Musuh jadi guru. Patah hati jadi dewasa. Sekarang lo tinggal LAKUKIN DENGAN SADAR.

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 berdiri di depan cermin. Di cermin, dia lihat dirinya sendiri. Tapi di atas pantulannya, ada berbagai kata yang bisa dia Pilih untuk menggambarkan dirinya:

Kata-kata redup: GAGAL, SENDIRI, KORBAN, GAK BERUNTUNG, LEMAH.
Kata-kata terang: BELUM BERHASIL, MERDEKA, PEMBELAJAR, LAGI PROSES, KUAT.

Tangan karakter menyentuh cermin — dan memilih kata di sisi terang. Cerminnya bersinar.

Di bawah cermin, ada teks kecil: Lo gak bisa selalu pilih APA yang terjadi. Tapi lo SELALU bisa pilih KATA apa yang lo pake buat ngegambarinnya.

Teks HEADLINE besar font bold di bagian atas:
SATU KATA BISA NGERUBAH DUNIA LO

Teks body medium:
Bukan realitanya yang berubah. Tapi ARTINYA. Dan arti itu — SEPENUHNYA milik lo.

Teks hook penutup:
Lo ngomong apa ke diri lo hari ini?

Teks closing:
Mulai dari satu kata. Ganti. Rasain bedanya. ikon tanaman

Teks CTA pojok bawah:
Follow balimentari

Teks kecil di atas CTA:
Tag temen yang perlu ganti kata-katanya 😬

Desain closing empowering hangat inspiratif.""")

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