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['slide5'] = generate("Map | Slide 5 - Update Peta Lo", """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: Karakter duduk di meja dengan peta di depannya. Peta lama (versi 1.0) digulung dan ditaruh di samping. Di depannya, dia lagi gambar peta BARU — lebih detail, lebih luas, lebih akurat.

3 langkah untuk upgrade peta:

Langkah 1 (ikon telinga + mulut): DENGARIN PETA ORANG LAIN — Tanyain: Lo ngerasain apa? Bukan buat setuju, tapi buat ngerti. Ini bukan perang peta. Ini nambah detail.

Langkah 2 (ikon orang + bola dunia): CARI PENGALAMAN BARU — Peta lo dibentuk dari pengalaman terbatas. Jalan kaki ke tempat baru. Ngobrol sama orang beda. Coba hal yang lo gak suka. Peta lo otomatis meluas.

Langkah 3 (ikon pensil + cermin): CEK PETA LO SENDIRI — Ini peta, bukan realita. Lo yakin? Bukti apa yang lo punya? Keyakinan ini dari mana? Sejak kapan lo percaya ini?

Teks HEADLINE bold:
GIMANA UPDATE PETA LO

Teks penutup:
Peta yang gak pernah di-update = GPS jaman 1990. Nyasar terus.

Desain infografis actionable.""")

urls['slide6'] = generate("Map | Slide 6 - Yang Bener Bukan Lo, Bukan Dia", """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 karakter dari slide 1 dan 4. Tadinya berantem. Sekarang duduk berdampingan. Masing-masing megang peta mereka sendiri. Di depan mereka ada satu peta KETIGA — gabungan dari kedua peta — lebih besar, lebih komplit.

Karakter A: "Oh... jadi lo ngeliatnya gitu."
Karakter B: "Oh... jadi lo ngerasanya gitu."

Mereka gak setuju. Tapi mereka NGERTI.

Di atas mereka, teks: KALO LO CUMA PERCAYA PETA LO — lo bertahan. Kalo lo mau LIAT PETA ORANG LAIN — lo bertumbuh.

Teks HEADLINE bold:
YANG BENER BUKAN LO. BUKAN JUGA DIA.

Teks penjelasan:
Yang bener adalah: dua-duanya punya PETA. Dan dua-duanya NGELIAT HAL YANG SAMA — cuma dari sudut yang BERBEDA.

Teks penutup:
Lo gak harus setuju. Lo cukup NGERTI: oh, peta dia kayak gitu.

Desain komik hangat transformatif.""")

urls['slide7'] = generate("Map | Slide 7 - Closing", """Instagram carousel closing slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style hangat.

Background gradasi soft cream ke deep teal blue hangat terang. Aksen orange.

Ilustrasi: Karakter berdiri di atas bukit. Di tangannya, dia megang peta. Tapi di depannya, terbentang dunia nyata yang jauh lebih luas dan lebih indah dari petanya. Peta di tangannya robek dikit — karena dia udah keluar dan NGERASAIN territory-nya langsung.

Di langit, teks besar melayang: THE MAP IS NOT THE TERRITORY.

Di bawah, teks: Dan lo bukan tawanan peta lo. Lo bisa UPGRADE. Kapan aja.

Teks HEADLINE besar font bold:
LO BUKAN PETA LO

Teks body medium:
Lo cuma kebetulan dibesarkan dengan peta tertentu. Lo bisa ganti. Lo bisa perluas. Lo bisa lihat dunia dari ribuan peta yang berbeda.

Teks hook penutup:
Dan pas lo sadar kalo yang lo rasain cuma peta — lo JAUH LEBIH BEBAS dari yang lo kira.

Teks closing:
Jangan debatin peta siapa yang bener. Tanya: gimana peta lo? ikon tanaman

Teks CTA pojok bawah:
Follow balimentari

Teks kecil di atas CTA:
Tag temen yang peta-nya beda banget sama lo 😬

Desain closing empowering wide horizon.""")

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