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("LL | Slide 5 - Ganti Identitas", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

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

Ilustrasi: Satu karakter di depan cermin. Di cermin ada dua refleksi dirinya:

Refleksi kiri (lama): karakter lesu, label di dada: GUE ORANG MALES. Di bawahnya, bubble: "Gue mau diet... tapi gue emang males sih." Hasil: balik ke McDonald's.

Refleksi kanan (baru): karakter yang SAMA, tapi tegap. Label di dada: GUE ORANG SEHAT. Di bawahnya, bubble: "Gue orang sehat. Orang sehat makan ini." Hasil: pilih salad.

Antara dua refleksi, ada panah transformasi: GANTI IDENTITAS → BEHAVIOR NGEKOR.

Teks HEADLINE bold:
LEVEL 5: IDENTITY — GANTI LO SIAPA, BEHAVIOR NGEKOR

Teks penjelasan:
Kalo lo percaya lo "orang males yang pengen kurus" — lo bakal struggle tiap hari. Kalo lo percaya lo "ORANG SEHAT" — keputusan sehat jadi otomatis. Identity dictates behavior.

Teks penutup:
Gak usah berubah SIApa lo. Cukup GANTI definisi lo tentang diri lo sendiri.

Desain komik empowering.""")

urls['slide6'] = generate("LL | Slide 6 - Cara Berubah yang Bener", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style infografis actionable.

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

Ilustrasi: Karakter berdiri di depan piramida terbalik dari slide 2. Sekarang dia gak cuma ngotak-atik satu level — tapi dia mulai DARI ATAS.

4 langkah dari atas ke bawah:

Langkah 1 (ikon bintang): TENTUIN PURPOSE — Buat apa lo berubah? Kalo alasannya cuma "biar keren" — gak cukup. Cari alasan yang BENERAN lo peduliin.

Langkah 2 (ikon cermin): TENTUIN IDENTITAS — Mulai sekarang, lo siapa? "Gue orang yang..." Isi titik-titik itu.

Langkah 3 (ikon hati): PERIKSA BELIEF — Lo percaya lo bisa? Kalo ada belief yang bentrok (misal: "orang kaya itu jahat"), belief itu bakal sabotase. Ganti dulu.

Langkah 4 (ikon lokasi): SESUAIIN ENVIRONMENT — Lingkungan lo support gak? Kalo gak, ganti environment dulu SEBELUM ganti behavior.

Langkah terakhir (bawah): BARU behavior & skills — ini ngikut otomatis.

Teks HEADLINE bold:
CARA BERUBAH YANG BENER: MULAI DARI ATAS

Teks penutup:
Orang gagal karena mulai dari bawah. Lo mulai dari atas — semuanya ngikut.

Desain infografis actionable game-changer.""")

urls['slide7'] = generate("LL | 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. Aksen orange.

Ilustrasi: Karakter berdiri di depan anak tangga 6 level (bukan lagi piramida, tapi tangga naik ke atas). Di setiap anak tangga ada ikon dari level-level tadi. Dia udah naik sampai level 5 (identity), hampir ke puncak (purpose). Tangannya megang pegangan. Postur tegap, percaya diri.

Di samping tangga, ada bekas-bekas percobaan lama: alarm rusak, buku berdebu, poster "NEW YEAR NEW ME" yang udah robek. Tapi sekarang dia gak butuh itu semua. Karena dia mulai dari ATAS.

Teks HEADLINE besar font bold:
BERUBAH ITU GAK SUSAH. LO CUMA SALAH MULAI.

Teks body medium:
Selama ini lo mulai dari behavior. Bangun pagi. Diet. Belajar. Tapi environment, belief, identity lo gak berubah. Ya balik lagi.

Teks hook:
Sekarang mulai dari ATAS. Tanya: Buat apa? Gue siapa? Gue percaya apa? Baru turun ke behavior.

Teks closing:
Lo bukan orang yang pengen berubah. Lo orang yang SEDANG berubah. ikon tanaman

Teks CTA pojok bawah:
Follow balimentari

Teks kecil di atas CTA:
Tag temen yang tiap tahun resolusi-nya sama terus 😬

Desain closing empowering.""")

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