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)

# SLIDE 1 - COVER
generate("Slide 1 - Cover", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik minimalis.

Warna palet monokrom hitam putih gradasi abu-abu dengan aksen kuning cerah (#FFD700).

Ilustrasi: dua kursi kosong saling berhadapan di sebuah ruangan remang. Satu kursi memiliki bayangan siluet seorang satpam duduk dengan tegap, ada topi satpam di atas meja kecil di sampingnya. Sebuah pintu besar di belakang dengan cahaya kuning samar dari baliknya. Nuansa misterius dan dramatis.

Teks judul besar font bold komik di bagian atas:
SI PENJAGA PINTU

Teks sub judul font medium di bawah:
Percakapan dengan critical factor di kepalamu

Ada garis dekoratif tipis. Gaya komik noir, clean dan striking.""")

# SLIDE 2 - PERCAKAPAN 1
generate("Slide 2 - Percakapan 1", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik minimalis.

Warna monokrom abu-abu dengan aksen kuning.

Ilustrasi: dua karakter berhadapan. Sebelah kiri: seorang karakter biasa dengan tangan terbuka, ekspresi memohon/bujuk. Sebelah kanan: siluet satpam bertopi, duduk tegak, tangan menyilang, ekspresi tegas. Ada meja kecil di antara mereka. Gaya komik noir.

Gaya dialog komik dengan teks font bold di dalam balon dialog:

Balon kiri (karakter biasa):
"Aku mau berubah jadi lebih baik."

Balon kanan (satpam):
"Boleh lihat CV dulu? Lo pernah gagal 5x. Gak masuk."

Balon kiri lagi:
"Tapi aku udah belajar."

Balon kanan:
"Belajar tapi belum terbukti. Maaf, data lama lebih kuat."

Ada ikon emoji 🚫 di samping satpam. Gaya komik strip noir.""")

# SLIDE 3 - PERCAKAPAN 2
generate("Slide 3 - Percakapan 2", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik minimalis.

Warna monokrom abu-abu dengan aksen kuning.

Ilustrasi: sama seperti slide sebelumnya — karakter biasa dan satpam berhadapan. Kali ini karakter biasa terlihat lebih frustrasi/kesal, satpam tetap tenang dengan senyum sinis tipis. Meja di tengah. Gaya komik noir.

Balon kiri (karakter biasa):
"Aku mau mulai bisnis."

Balon kanan (satpam):
"Omong kosong. Lu lupa waktu usaha jualan pulsa di 2015 bangkrut?"

Balon kiri:
"Itu 11 tahun lalu!"

Balon kanan:
"Buat saya, data lama = data selamanya."

Ikon 🚫 dan 🧐 di samping satpam. Gaya komik strip noir.""")

# SLIDE 4 - CARA NEGOSIASI
generate("Slide 4 - Cara Negosiasi", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis minimalis.

Warna monokrom abu-abu dengan aksen kuning cerah.

Ilustrasi: satpam duduk di meja, di depannya ada 4 lembar kertas dengan ikon checklist. Karakter biasa berdiri di samping dengan tangan memegang setumpuk dokumen. Ada ikon percakapan kuning. Gaya infografis komik.

Teks headline besar di atas font bold:
Gimana caranya nego sama critical factor?

4 step vertikal dengan ikon bullet kuning:

1. Jangan lawan. Satpam makin kuat kalau dilawan.
2. Bawa bukti baru. Setiap pencapaian kecil = data baru.
3. Ulang terus. Satpam bosan telat masukin deh.
4. Pas lagi ngantuk. Jam 11 malem satpam juga capek.

Desain step-by-step rapi, mudah diikuti.""")

# SLIDE 5 - CONTOH SEHARI-HARI
generate("Slide 5 - Contoh Sehari-hari", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis minimalis.

Warna monokrom abu-abu dengan aksen kuning cerah.

Ilustrasi: timeline vertikal dari pagi ke malam. Ikon matahari di atas, ikon malam di bawah. Tiga titik di timeline dengan ikon: ikon jam weker (pagi), ikon kertas checklist (siang), ikon buku (malam). Gaya infografis komik.

Teks headline font bold di atas:
Pasang bukti baru tiap hari!

Tiga kartu horizontal rapi:

☀️ Pagi: Hari ini aku bangun tepat waktu.
☀️ Siang: Aku nyelesaiin 1 tugas.
🌙 Malam: Aku pilih gak scroll HP, lebih baik baca.

Teks info di bawah:
Setiap bukti kecil = data baru buat critical factor. Lama-lama satpam percaya: Oh dia beneran berubah.

Desain bersih rapi.""")

# SLIDE 6 - CLOSING
generate("Slide 6 - Closing", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik minimalis.

Warna monokrom abu-abu dengan aksen kuning hangat.

Ilustrasi: satpam dan karakter biasa sekarang duduk bersebelahan, bukan berhadapan. Satpam menepuk pundak karakter biasa, ekspresi ramah. Pintu di belakang terbuka dengan cahaya kuning hangat masuk. Nuansa hangat dan damai. Gaya komik noir.

Teks headline besar font bold di atas:
Critical factor bukan musuh. Dia cuma terlalu protektif.

Teks ukuran medium di tengah:
Tugas lo bukan melawannya — tapi memberi data baru lewat:
✅ Pengulangan
✅ Emosi
✅ Waktu yang tepat

Teks CTA di bawah:
Like & share buat bantu yang lain paham cara kerja otaknya!

Ada ikon 🛡️ kecil. Gaya closing yang hangat dan memotivasi.""")

print("\n✅ ALL SLIDES COMPLETE!")
