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

Background gradasi soft cream ke deep teal blue. Nuansa bold-mindblowing.

Ilustrasi: Dua panel besar berdampingan.

PANEL KIRI: Ingatan "malu di depan kelas" — gambarnya BESAR, CERAH, DEKAT, dan ada SUARA KERAS temen-temen ketawa. Di bawah: TRAUMA. Kelihatan banget.

PANEL KANAN: Ingatan "juara lomba" — gambarnya KECIL, REDUP, JAUH, dan sunyi. Di bawah: PRESTASI. Gak kelihatan.

Di antara dua panel, ada otak dengan label: OTAK LO NGODING INGATAN PAKE SUBMODALITIES — besar/kecil, terang/redup, dekat/jauh. Dan lo bisa UBAH setting-nya.

Teks HOOK besar:
SUBMODALITIES

Teks hook:
KENAPA INGATAN MALU LEBIH JELAS DARI PRESTASI LO SENDIRI?

Desain bold mind-blowing.""")

urls['slide2'] = generate("SM | Slide 2 - Apa Itu Submodalities", """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: Otak besar di tengah, seperti komputer dengan panel kontrol. Di panel kontrol ada berbagai SLIDER dan KNOB:

SLIDER VISUAL: Brightness, Size, Distance, Color vs B/W, Movie vs Still, Framed vs Panoramic
SLIDER AUDITORY: Volume, Tone, Tempo, Location of sound, Mono vs Stereo
SLIDER KINESTHETIC: Temperature, Pressure, Texture, Weight, Intensity

Di bawah: OTAK LO NGODING SETIAP PENGALAMAN PAKE SLIDER INI.

Teks HEADLINE bold:
APA ITU SUBMODALITIES?

Teks definisi:
Otak lo menyimpan ingatan bukan sebagai "fakta netral." Setiap ingatan dikodekan dengan KUALITAS SENSORIK — ukuran, kecerahan, jarak, volume, suhu, tekanan. Ini namanya SUBMODALITIES.

Teks penutup:
Trauma biasanya: BESAR + CERAH + DEKAT + SUARA KERAS. Prestasi: KECIL + REDUP + JAUH + SUNYI. BUKAN KARENA BEGITU REALITANYA — tapi karena otak lo NGODING kayak gitu.

Desain infografis mind-blowing.""")

urls['slide3'] = generate("SM | Slide 3 - Kenapa Trauma Lebih Nempel", """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 ingatan dibandingkan:

INGATAN 1 (label: MALU KELAS 5 SD): Gambar BESAR memenuhi panel, WARNA penuh, TERANG, seperti layar IMAX di depan mata, ada suara TAWA TEMAIN SEKELAS yang KERAS. Posisi: seperti terjadi SEKARANG.

INGATAN 2 (label: JUARA KELAS 3 SD): Gambar KECIL di pojok, HITAM PUTIH, BURAM, kayak foto lama yang udah pudar. Jauh. Gak ada suara.

Di bawah: SUBMODALITIES mereka BEDA. Makanya trauma berasa SEKARANG. Prestasi berasa DULU.

Teks HEADLINE bold:
KENAPA MALU LEBIH NEMPEL DARI JUARA?

Teks penjelasan:
Bukan karena malunya LEBIH PENTING. Tapi karena cara otak lo NGODING-nya beda. Trauma dikodekan seperti film IMAX. Prestasi dikodekan seperti foto lawas. Dan ini BISA lo UBAH.

Desain komik insight.""")

urls['slide4'] = generate("SM | Slide 4 - Ubah Setting Ingatan", """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: Tangan karakter lagi megang remote control ajaib yang bisa ngontrol panel submodalities di otak.

3 langkah praktis:

Langkah 1: INGET TRAUMA KECIL — jangan yang berat dulu. Misal: malu presentasi. SADARI submodalities-nya: Seberapa besar? Di mana posisinya? Warna atau hitam putih? Ada suara? Volume berapa?

Langkah 2: UBAH SLIDER — Kecilin gambarnya. Dorong jauh-jauh. Jadiin hitam putih. Kecilin suaranya sampe bisik-bisik. Kasih sirkus music di background (ini bikin otak lo gak bisa serius).

Langkah 3: BANDINGKAN RASA — Sebelum vs sesudah. Biasanya setelah diubah submodalities-nya, intensitas emosi turun drastis. Karena otak lo gak bisa NGODING hal yang SAMA dengan emosi yang SAMA kalo setting-nya berubah.

Teks HEADLINE bold:
LO BISA UBAH SETTING INGATAN LO

Teks penutup:
Ini bukan sulap. Ini neuroscience + NLP. Dan lo bisa praktekin sekarang.

Desain infografis actionable.""")

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