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['slide1'] = generate("Slide 1 - Cover", """Instagram carousel cover slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style.

Background gradasi dari soft cream ke deep teal blue. Nuansa bold mind-blowing.

Ilustrasi: Satu kata ditulis besar di tengah: DI-PHK. Tiba-tiba kata itu memudar, muncul kata lain di atasnya: DI-BEBASKAN. Antara dua kata itu, ada karakter berdiri. Sebelah kiri — dia murung, kepala tunduk. Sebelah kanan — dia melangkah ke depan, punggung tegak. Padahal karakternya ORANG YANG SAMA. Yang beda cuma SATU KATA.

Visualisasi kayak filter lensa — kata yang berbeda ngeubah ekspresi dan postur dia. Di kiri ada teks kecil: Satu kata bisa bikin lo TERPURUK. Di kanan: Satu kata bisa bikin lo MELANGKAH.

Teks HOOK besar font bold di bagian atas:
THE ONE-WORD REFRAME

Teks hook lanjutan:
SATU KATA BISA NGERUBAH ARTI SEUMUR HIDUP

Teks sub-heading:
Lo bilang DI-PHK. Ganti satu kata: DI-BEBASKAN. Gimana rasanya? BEDA KAN?

Desain bold striking mind-blowing satu kata transformasi.""")

urls['slide2'] = generate("Slide 2 - Kata Punya Kekuasaan", """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: Sebuah kata besar melayang di tengah. Di bawahnya, otak manusia digambar sederhana. Dari kata itu, ada panah menuju otak. Begitu masuk, otak berubah warna: dari abu-abu ke warna emosional sesuai kata.

Visual: 3 contoh sederhana berdampingan:

Kata: GAGAL → Otak: redup, layu
Kata: BELAJAR → Otak: terang, tumbuh
Kata: SENDIRI → Otak: sepi, gelap
Kata: MERDEKA → Otak: cerah, bebas

Teks HEADLINE bold di atas:
SATU KATA. SATU MAKNA. SATU DUNIA.

Teks penjelasan:
Otak lo gak cuma ngerti kata. Otak lo HIDUPIN kata. Setiap kata punya rasa, gambar, suara, memori. Bukan cuma 'definisi'.

Teks bold orange:
Kalo lo ganti SATU KATA — lo ganti SELURUH PENGALAMAN lo tentang sesuatu.

Desain infografis sederhana tapi mind-blowing.""")

urls['slide3'] = generate("Slide 3 - Reframe: DI-PHK ke DI-BEBASKAN", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

Background gradasi soft cream ke deep teal blue.

Ilustrasi: Dua panel berdampingan kayak komik.

PANEL KIRI (sebelum reframe):
Karakter duduk di meja, di depannya surat pemutusan kerja. Label besar: DI-PHK.
Di kepalanya ada gelembung pikiran gelap:
• Gue gak berguna
• Masa depan suram
• Malu sama keluarga
• Gagal total
Postur: bungkuk, lesu.

PANEL KANAN (setelah reframe):
Karakter yang sama. Tapi suratnya sekarang dibalik. Label besar: DI-BEBASKAN.
Di kepalanya ada gelembung pikiran terang:
• Gue bisa cari yang lebih baik
• Kesempatan baru
• Akhirnya bisa istirahat bentar
• Next level
Postur: tegap, mata menyala.

Di antara dua panel, ada ilustrasi tangan yang MEMUTAR lensa kamera — itulah "reframe."

Teks HEADLINE bold:
REFRAIM #1: DI-PHK → DI-BEBASKAN

Teks penjelasan:
Realitanya SAMA. Lo tetep gak kerja. Tapi kata DI-PHK bikin lo KORBAN. Kata DI-BEBASKAN bikin lo PEMAIN.

Teks penutup:
Siapa yang nentuin lo korban atau pemain? Kata-kata lo sendiri.

Desain komik transformatif mind-blowing.""")

urls['slide4'] = generate("Slide 4 - Reframe: GAGAL ke BELUM BERHASIL", """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 berdiri di depan 3 pintu. Pintu 1 bertuliskan GAGAL. Pintu 2 bertuliskan GAGAL. Pintu 3 bertuliskan GAGAL.

SEMUA TERTUTUP.

Karakter murung. Di atas kepala: "Gue gagal lagi. Gagal terus."

Lalu ada tangan yang mengubah tulisan di semua pintu jadi: BELUM BERHASIL.

Seketika karakter berubah. Dia berdiri, melihat ke depan. Pintu-pintu masih tertutup — tapi sekarang dia MENCARI PINTU KE-4.

Label visual: GAGAL bikin lo BERHENTI. BELUM BERHASIL bikin lo LANJUT.

Teks HEADLINE bold:
REFRAIM #2: GAGAL → BELUM BERHASIL

Teks penjelasan:
GAGAL adalah status akhir. BELUM BERHASIL adalah status sementara. Lo gak bisa move on dari status akhir. Tapi status sementara? Lo selalu bisa next step.

Teks penutup:
Bedanya cuma satu kata: BELUM.

Desain komik ngena empowering.""")

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