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 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 = {}

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 (#FFF8F0) ke deep teal blue (#1A5F7A).

Ilustrasi: karakter berdiri di tengah, dengan dua tangan memegang dua keping puzzle yang BEDA BENTUK. Tangan kiri memegang keping puzzle dengan label YANG AKU TAHU BENAR. Tangan kanan memegang keping puzzle dengan label YANG AKU LAKUIN. Kedua keping jelas gak cocok, ada celah besar, tapi karakter maksa nyatuin keringat di dahi ekspresi tegang. Di belakangnya otak dengan tanda bahaya kecil menyala. Style flat minimalis.

Teks HOOK besar font bold di bagian atas:
COGNITIVE DISSONANCE

Teks hook lanjutan ukuran sama:
OTAKMU BENCI KONTRADIKSI

Teks sub-heading di bawah:
Kamu tahu A salah. Tapi tetap lakuin A. Trus otakmu gimana?

Desain bold striking font besar mudah terbaca.""")

urls['slide2'] = generate("Slide 2 - Apa Itu", """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 timbangan di dalam kepala karakter. Di sisi kiri timbangan ikon bola lampu dengan label KEYAKINAN Merokok itu bunuh diri pelan-pelan. Di sisi kanan timbangan ikon rokok dengan label TINDAKAN Ngerokok tiap hari. Timbangan gak seimbang bergetar hebat.

Di bawah timbangan otak kecil terlihat panik alarm menyala lampu merah. Ada dua opsi panah:

Panah 1 ke kiri: UBAH KEYAKINAN Ah kakek gue ngerokok umur 90 kok.
Panah 2 ke kanan: UBAH TINDAKAN Berhenti ngerokok.

Tapi panah pertama lebih tebal.

Teks HEADLINE bold di atas:
APA ITU COGNITIVE DISSONANCE?

Teks definisi:
Rasa gak nyaman yang muncul saat otakmu nemu KONTRADIKSI antara apa yang kamu PERCAYA vs apa yang kamu LAKUIN.

Teks penjelasan:
Otak benci kontradiksi. Jadi dia akan berusaha NGE-FIX entah dengan ngubah tindakan atau ngubah keyakinan.

Teks bold orange:
Tebak mana yang lebih sering dipilih? Yang kedua. Karena lebih gampang.

Desain infografis edukatif clean.""")

urls['slide3'] = generate("Slide 3 - Mekanismenya", """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 tiga panel vertikal:

Panel 1 atas: Karakter pegang rokok buang rokok ke tempat sampah. Label CARA 1 UBAH TINDAKAN Berhenti ngerokok. Ada tanda peringatan SUSAH di sampingnya.

Panel 2 tengah: Karakter yang sama pegang rokok ada gelembung pikiran Kakek gue ngerokok 60 tahun umur 90 sehat-sehat aja. Label CARA 2 UBAH KEYAKINAN Cari pengecualian. Ada tanda centang GAMPANG.

Panel 3 bawah: Karakter scroll HP lihat berita Ahli gizi telur kolesterol tinggi. Skip. Scroll lagi. Studi baru telur superfood. Stop baca senyum. Label CARA 3 CARI BUKTI BARU YANG MENGUNTUNGKAN Confirmation bias.

Teks HEADLINE di atas:
3 CARA OTAK NGE-FIX KONTRADIKSI

Teks penutup bawah:
Otak gak selalu cari yang BENER. Otak cari yang ENAK.

Desain infografis tiga panel rapi.""")

urls['slide4'] = generate("Slide 4 - Contoh Rokok", """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 dengan rokok di tangan duduk santai. Di sampingnya ada poster kesehatan gambar paru-paru hitam dengan tulisan besar MEROKOK MEMBUNUHMU.

Tapi karakter tenang. Gelembung pikiran berisi daftar RASIONALISASI:

1. Kakek gue ngerokok umur 90.
2. Yang gak ngerokok juga mati.
3. Gue cuma ngerokok kalo stres.
4. Banyak yang lebih parah narkoba.
5. Hidup cuma sekali. Nikmatin aja.
6. Ah nanti juga berhenti.

Di pojok bawah otak kecil dengan kacamata dan dasi megang clipboard centang-centang daftar Rasionalisasi berhasil. Kontradiksi teratasi. Aman.

Teks HEADLINE di atas:
CONTOH 1: PEROKOK DAN POSTER BAHAYA ROKOK

Teks penutup bawah:
Otakmu Aduh gak nyambung nih. Bahaya tapi gue lakuin.
Otakmu juga Tenang gue punya 6 alasan kenapa ini gapapa.

Desain komik relatable lucu tapi ngena.""")

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