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

Background gradasi soft cream ke deep teal blue.

Ilustrasi: karakter di depan cermin bilang AKU PEDE AKU PEDE AKU PEDE dengan ekspresi tegang. Di cermin bayangannya terlihat ragu dan takut. Ada gelembung bawah sadar di belakang Gue sih gak percaya.

Di samping perbandingan:

Sisi kiri AFIRMASI gagal: AKU PEDE perintah langsung. Bawah sadar Gak. Kamu gak.
Sisi kanan SUGESTI work: Dan kamu bisa bayangin gimana rasanya kalo kamu mulai ngerasa lebih pede sedikit demi sedikit. Bawah sadar Iya gue bisa bayangin.

Teks HEADLINE di atas:
KENAPA AFIRMASI GAK SELALU WORK?

Teks penjelasan:
Afirmasi keras perintah ke bawah sadar yang LAGI KEBAL. Dia gak suka diperintah.
Hypnotic language UNDANGAN. Bawah sadar diizinkan merasakan sendiri.

Teks bold orange:
Afirmasi KAMU HARUS PERCAYA DIRI
Hypnotic Dan kamu mungkin mulai ngerasakan rasa percaya diri yang dulu sempat hilang kini kembali sedikit demi sedikit.

Teks penutup:
Yang mana lebih gampang diterima bawah sadar?

Desain komik edukatif praktis.""")

urls['slide6'] = generate("Slide 6 - Cara Pake buat Diri Sendiri", """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 di depannya ada kertas dengan bullet points. Dia lagi ngomong ke dirinya sendiri di cermin bukan pake afirmasi keras tapi pake hypnotic language. Di cermin bayangannya tersenyum.

4 teknik sebagai kartu:

Kartu 1 ikon kabur: PAKAI KATA AMBIGU Mungkin aku bisa merasa lebih tenang. Mungkin dan bisa ngasih ruang. Bawah sadar gak merasa dipaksa.

Kartu 2 ikon panah: PAKAI PROSES BUKAN HASIL Setiap hari sedikit demi sedikit aku mulai merasa lebih baik. Proses lebih gampang diterima daripada target instan.

Kartu 3 ikon rantai: PAKAI DAN BUKAN TAPI Aku tau ini sulit DAN aku bisa lewatin. Dan nyambung. Tapi ngelawan.

Kartu 4 ikon waktu: PAKAI SETELAH Setelah aku tarik napas dalam-dalam aku mulai merasa lebih tenang. Setelah ngasih urutan waktu. Otak otomatis ngikutin.

Teks HEADLINE di atas:
CARA PAKAI HYPNOTIC LANGUAGE UNTUK DIRI SENDIRI

Teks penutup:
Kamu gak perlu jadi hipnoterapis. Cukup ubah CARA kamu ngomong ke diri sendiri.

Desain infografis praktis actionable.""")

urls['slide7'] = generate("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 duduk santai di kursi taman memegang mic kecil seperti podcaster. Dari mulutnya keluar kata-kata yang berbentuk geometri indah lingkaran segitiga bintang melayang ke arah pendengar. Kata-katanya bukan kabut lagi tapi bentuk yang jelas dia udah MASTER hypnotic language.

Di depannya ada papan tulis kecil dengan 4 rumus sederhana:

RUMUS HYPNOTIC LANGUAGE:
1. Ambigu Mungkin
2. Proses Sedikit demi sedikit
3. Dan nyambungin
4. Setelah urutan waktu

Karakter tersenyum puas.

Teks HEADLINE besar font bold di bagian atas:
KATA-KATA ADALAH HIPNOSIS.

Teks body medium:
Sadar atau gak kamu dihipnosis setiap hari. Oleh iklan. Oleh content creator. Oleh orang sekitar. Oleh diri sendiri.

Teks hook penutup:
Sekarang giliran kamu yang pegang mic.

Teks closing:
Pilih katamu dengan sadar. Karena kata-kata masuk ke bawah sadar. ikon tanaman

Teks CTA pojok bawah:
Follow balimentari

Teks kecil di atas CTA:
Tag temen yang jago banget bungkus kata-kata

Desain closing hangat empowering.""")

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