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 melankolis.

Ilustrasi: karakter berdiri di tengah, dari tubuhnya keluar tali-tali yang nyambung ke berbagai benda melayang di sekelilingnya: headphone lagu, secangkir kopi, sebotol parfum, selembar foto lama, sentuhan tangan, satu kata maaf. Tiap benda punya tali berwarna berbeda merah marah biru sedih kuning senang ungu rindu. Karakter memegang salah satu tali lagu dan ekspresinya berubah mata berkaca-kaca senyum getir. Dia gak tau kenapa lagu ini bikin dia gini.

Teks HOOK besar font bold di bagian atas:
ANCHOR

Teks hook lanjutan ukuran sama:
KENAPA SATU LAGU BISA BIKIN KAMU NANGIS?

Teks sub-heading di bawah:
Satu bau. Satu kata. Satu sentuhan. Tiba-tiba perasaan lama dateng lagi.

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

generate("Slide 2 - Apa Itu Anchor", """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 diagram Pavlov klasik dalam bentuk ilustrasi modern.

Panel kiri SEBELUM: Anjing digambar lucu flat style melihat makanan mulut ngiler. Label STIMULUS makanan RESPONS ngiler.

Panel tengah PROSES: Anjing yang sama sekarang ada BEL di samping makanan. Setiap kali makanan dateng bel bunyi. Berulang. Label PEMASANGAN ANCHOR Bel Makanan Ngiler.

Panel kanan SESUDAH: Anjing yang sama sekarang BEL DOANG gak ada makanan tapi anjing TETAP NGILER. Label ANCHOR TERBENTUK Bel Ngiler.

Di bawah analogi manusia: seorang karakter manusia denger lagu tertentu dadanya sesak mata berkaca-kaca padahal lagunya gak sedih-sedih amat. Label Begitu juga kamu. Lagu Baper.

Teks HEADLINE bold di atas:
APA ITU ANCHOR?

Teks definisi:
Anchor adalah hubungan otomatis antara STIMULUS dan RESPONS yang terbentuk karena pengalaman masa lalu.

Teks penjelasan:
Istilah dari Pavlov anjing ngiler pas denger bel. Manusia juga gitu bedanya anchor kita lebih kompleks bisa lagu bau kata orang tempat.

Teks bold orange:
Kamu gak milih anchor ini. Tapi mereka ada dan bekerja setiap hari.

Desain infografis edukatif relatable.""")

generate("Slide 3 - Bagaimana Anchor Terbentuk", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style step infografis.

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

Ilustrasi timeline pembentukan anchor dalam kehidupan seseorang.

LANGKAH 1 atas: Momen emosional kuat seorang anak kecil dipeluk erat oleh ibunya setelah jatuh. Ada aroma parfum ibu yang khas. Emosi AMAN NYAMAN DICINTAI. Momen ini direkam BESAR oleh otak termasuk detail parfum texture pelukan nada suara.

LANGKAH 2 tengah: Waktu berlalu. Anak itu tumbuh dewasa. Suatu hari dia jalan di mall tiba-tiba mencium aroma parfum yang SAMA dipake orang lewat. Tanpa sadar dia berhenti. Dadanya hangat. Matanya berkaca-kaca. Ada rasa aman yang tiba-tiba datang. Label BOOM Anchor aktif.

LANGKAH 3 bawah: Karakter dewasa berdiri di mall bingung kenapa tiba-tiba sedih dan kangen. Di sampingnya ada tulisan Dia gak tau kenapa. Tapi otaknya tau. Tubuhnya inget.

Teks HEADLINE bold di atas:
BAGAIMANA ANCHOR TERBENTUK?

Teks penjelasan:
1. Ada momen dengan EMOSI KUAT baik positif atau negatif.
2. Otak merekam momen itu BESERTA detail sensorik di sekitarnya.
3. Detail sensorik itu jadi TRIGGER anchor.
4. Setelah itu setiap kali trigger muncul emosi yang SAMA ikut muncul.

Teks penutup:
Kamu gak perlu inget momen aslinya. Tubuhmu yang inget.

Desain infografis step rapi.""")

generate("Slide 4 - Anchor Positif", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style hangat.

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

Ilustrasi komik tiga panel hangat.

Panel 1 MASA KECIL: Anak kecil duduk di meja makan. Papanya selesai makan tepuk pundak anaknya sambil bilang PAPA BANGGA SAMA KAMU NAK. Anaknya tersenyum lebar. Ada kehangatan visual sinar lembut.

Panel 2 DEWASA SITUASI SULIT: Karakter dewasa anak itu duduk di meja kerja stres deadline menumpuk kepala ditundukkan gelap. Label SITUASI SULIT.

Panel 3 DEWASA ANCHOR AKTIF: Tiba-tiba ada yang tepuk pundaknya rekan kerja cuma bilang kamu pasti bisa. Karakter menegakkan badan. Ada sensasi hangat di dada sama seperti waktu papa dulu tepuk pundaknya. Label ANCHOR POSITIF AKTIF tanpa sadar.

Teks HEADLINE di atas:
CONTOH ANCHOR POSITIF

Teks penjelasan:
Sentuhan di pundak kata bangga dari papa anchor KEAMANAN dan KEPERCAYAAN DIRI.
20 tahun kemudian tepukan di pundak masih bisa aktifin rasa yang sama.

Teks penutup:
Ini kenapa dukungan kecil di masa kecil itu POWERFUL banget.

Desain komik hangat heartwarming.""")

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