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
                            elif stat == 'failed':
                                print(f"❌ FAILED: {st.get('error_message')}")
                                return
                    except:
                        time.sleep(5)
        except Exception as e:
            print(f"  ⚠️ Retry {attempt+1}/3... ({e})")
            time.sleep(5)

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). Nuansa agak gelap dramatis tapi tetap warm.

Ilustrasi: seorang karakter marah jari menunjuk ke depan dengan mulut terbuka dan alis turun ekspresi emosi. Di depannya ada orang lain yang ekspresi bingung dan polos dengan tanda tanya besar di atas kepala. Tapi bayangan di dinding menceritakan cerita lain — bayangan karakter marah itu terproyeksi ke orang lain seperti gunung es dengan ingatan trauma di belakangnya. Ada efek visual seperti proyektor pantulan. Style flat minimalis.

Teks HOOK besar font bold di bagian atas:
KENAPA KAMU MARAH

Teks hook lanjutan ukuran sama:
KE ORANG YANG GAK SALAH?

Teks sub-heading di bawah:
Kadang yang bikin kamu emosi bukan dia. Tapi sesuatu di masa lalu.

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

generate("Slide 2 - Projection", """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 proyektor film jadul yang menyorotkan gambar ke layar. Di proyektor ada label BAWAH SADAR dan di dalamnya ada gulungan film lama dengan label MASA LALU: Trauma, Luka, Ketakutan. Gambar yang diproyeksikan ke layar adalah bayangan seseorang yang marah besar. Tapi di depan layar berdiri orang yang beneran polos — bukan orang yang dimarahin di film. Style flat minimalis.

Teks HEADLINE bold di atas:
PROJECTION — FENOMENA PSIKOLOGI YANG JARANG DISADARI

Teks definisi:
Projection adalah saat kamu memproyeksikan emosi, luka, atau ketakutan dari masa lalu ke orang yang ADA DI DEPANMU SEKARANG.

Teks penjelasan tambahan:
Masalahnya: orang di depanmu itu bukan pelaku aslinya. Dia cuma layar — yang nangkep proyeksi dari trauma lamamu.

Desain infografis edukatif clean.""")

generate("Slide 3 - Contoh 1", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik dua panel.

Background gradasi soft cream ke deep teal blue.

Ilustrasi split:

Panel atas SEKARANG: Pasangan di meja makan. Salah satu marah besar menunjuk piring sambil ngomong, yang satu diam bingung. Gelembung ucapan marah: KAMU NGGAK PERNAH DENGERIN AKU!!

Panel bawah MASA LALU: Seorang anak kecil berdiri di depan orang tua dewasa yang sibuk pegang koran dan membelakangi. Anak kecil itu ngomong sesuatu tapi gak didenger. Ekspresi anak sedih dan frustrasi. Garis putus-putus menghubungkan kedua situasi.

Teks di antara panel:
Yang kamu marahin sekarang pasanganmu.
Yang sebenarnya bikin kamu marah orang tuamu 20 tahun lalu.

Teks penutup:
Trigger dari bawah sadar: SAMA-SAMA GAK DIDENGERIN.

Desain komik relatable eye-opening.""")

generate("Slide 4 - Contoh 2", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik dua panel.

Background gradasi soft cream ke deep teal blue.

Ilustrasi split:

Panel atas SEKARANG: Teman kerja ngomong santai sambil ketawa ringan, Wah, kamu teliti banget ya! — maksudnya pujian. Tapi karakter yang dengar langsung kaku, muka merah, marah. Gelembung pikirannya: Dia ngejek aku! Dia bilang aku terlalu ribet!

Panel bawah MASA LALU: Anak kecil dibentak guru, Kamu kenapa sih lambat banget?! — teman-teman sekelas ketawa. Rasa malu dan marah yang sama. Garis energi dari masa lalu ke masa kini.

Teks di antara panel:
Temenmu cuma bilang KAMU TELITI tapi kamu dengar KAMU RIBET.

Itu bawah sadarmu yang lagi mikir: INI SAMA KAYAK DULU. BAHAYA.

Desain komik relatable. Teks font bold jelas.""")

print("\n✅ BATCH 1-4 COMPLETE!")
