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("Map | 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: Dua karakter berdiri berhadapan. Di antara mereka, ada lukisan besar sebuah pohon. Karakter kiri ngeliat pohon itu dengan caption: POHON INI INDAH. Karakter kanan ngeliat pohon yang SAMA — tapi caption dia: POHON INI MENYERAMKAN. Dua-duanya ngeliat pohon yang sama. Tapi dunia mereka BEDA.

Di bawah ilustrasi, ada teks kecil: Realitanya SATU. Petanya BEDA.

Visualisasi split-screen kayak dunia paralel — kiri terang ceria, kanan gelap misterius — tapi objeknya IDENTIK.

Teks HOOK besar font bold di bagian atas:
THE MAP IS NOT THE TERRITORY

Teks hook lanjutan:
LO GAK NGERASAIN REALITA. LO NGERASAIN PETA LO.

Teks sub-heading:
Lo debat sama pacar: Lo gak perhatian! Dia: Aku udah perhatian! Siapa yang bener? DUA-DUANYA.

Desain bold mind-blowing striking.""")

urls['slide2'] = generate("Map | Slide 2 - Apa Itu Map vs Territory", """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: Dua panel.

Panel kiri: PETA — sebuah peta kertas digambar tangan. Ada gunung, sungai, jalan. Tapi peta itu SIMPLE: cuma garis dan tulisan. Di bawah: INI PETA LO. Interpretasi. Filter. Keyakinan. Trauma masa lalu. Nilai-nilai.

Panel kanan: TERRITORY — lanskap aslinya: gunung beneran, sungai beneran, kompleks, penuh detail yang gak ada di peta. Di bawah: INI REALITA. Jauh lebih kompleks dari yang lo kira.

Di tengah, teks besar: PETA ≠ TERRITORY.

Teks HEADLINE bold:
APA ITU MAP IS NOT THE TERRITORY?

Teks definisi:
Ini prinsip paling fundamental di NLP dan filsafat. Lo GAK ngalamin realita secara langsung. Lo ngalamin PETA mental lo tentang realita — dan peta itu DISUSUN dari pengalaman, keyakinan, trauma, filter budaya, bahasa.

Teks penutup:
Masalahnya? Lo LUPA kalo yang lo rasain cuma peta. Lo kira itu realita.

Desain infografis edukatif.""")

urls['slide3'] = generate("Map | Slide 3 - Gimana Peta Dibentuk", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis.

Background gradasi soft cream ke deep teal blue.

Ilustrasi: Karakter berdiri di tengah. Di sekelilingnya ada 5 "filter" atau lensa yang menyaring informasi sebelum masuk ke otaknya:

Filter 1 (ikon keluarga): KELUARGA — "Orang kaya itu jahat." Lo denger dari kecil.

Filter 2 (ikon pengalaman): PENGALAMAN — Pernah ditolak pas jujur. Sekarang lo filter: "Jujur = disakiti."

Filter 3 (ikon budaya): BUDAYA — "Laki-laki gak boleh nangis." Lo hidupin tanpa sadar.

Filter 4 (ikon bahasa): BAHASA — Kata-kata yang lo punya ngebatasin apa yang bisa lo pikirkan.

Filter 5 (ikon keyakinan): KEYAKINAN — "Gue gak pantes." Auto-filter semua bukti yang bertentangan.

Semua filter itu bikin PETA PRIBADI lo. Gak ada yang salah. Cuma perlu sadar: ini peta — bukan realita.

Teks HEADLINE bold:
GIMANA PETA LO DIBENTUK

Teks penutup:
Peta lo gak salah. Tapi peta lo GAK LENGKAP. Dan yang bahaya: lo kira peta lo SATU-SATUNYA yang bener.

Desain infografis insight nusuk.""")

urls['slide4'] = generate("Map | Slide 4 - Peta Beda Realita Sama", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

Background gradasi soft cream ke deep teal blue.

Ilustrasi: 3 panel komik contoh nyata.

Panel 1: PASANGAN — Dua karakter di sofa. Karakter A: KAMU GAK PERHATIAN! (dalam kepalanya: perhatian = chat tiap jam). Karakter B: AKU UDAH PERHATIAN BANGET! (dalam kepalanya: perhatian = masakin dan anter jemput). Di bawah: Peta beda. Perang sia-sia.

Panel 2: BOSS — Karakter A (boss): KENAPA LAMBAT BANGET? (petanya: cepet = 1 jam, deadline gue dari direktur). Karakter B (staff): INI UDAH CEPET! (petanya: tugas ini rumit, 3 jam udah cepet). Di bawah: Gak ada yang bohong. Petanya beda.

Panel 3: TEMEN — Karakter A: LO SOK SIBUK BANGET SIH? (petanya: temenan = sering ketemu). Karakter B: GUE BUKAN SOK SIBUK, GUE BENERAN SIBUK! (petanya: temenan = quality time walau jarang). Di bawah: PETA BUKAN REALITA.

Teks HEADLINE bold:
PETA BEDA. REALITA SAMA. MASALAH MULAI.

Desain komik relatable nusuk.""")

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