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 - Generalization", """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 cewek duduk di sofa, di depannya ada 3 momen yang berbeda:

Momen 1 (kiri): Cowok pertama telat 1 jam. Label: MANTAN PERTAMA.

Momen 2 (tengah): Cowok kedua telat 15 menit. Label: MANTAN KEDUA.

Momen 3 (kanan): Cowok sekarang telat 5 menit karena hujan. Label: PASANGAN SEKARANG.

Tapi di kepala cewek, filter GENERALIZATION bekerja — seperti cap stempel besar yang ngecap SEMUA cowok dengan label yang sama: "COWOK = TUKANG NGARET. GAK BISA DIPERCAYA."

Pasangan sekarang udah chat "Maaf hujan deras, telat 5 menit ya" — tapi si cewek udah sebel duluan. Generalization.

Visual: mesin cap stempel besar mengecap semua cowok dengan label yang sama.

Teks HEADLINE di atas:
"FILTER 3: GENERALIZATION (PENYAMARATAAN)"

Teks penjelasan:
"Otak bikin ATURAN UMUM dari satu atau dua kejadian. Sekali disakiti cowok semua cowok sama."

Teks contoh:
"Sekali mantan telat 1 jam."
"Dua kali cowok telat."
"Maka: SEMUA COWOK TUKANG NGARET."

Teks penutup:
"Padahal yang sekarang cuma telat 5 menit karena hujan. Tapi filter udah mutusin duluan."

Desain komik relatable eye-opening.""")

urls['slide6'] = generate("Slide 6 - Cara Fix Miskomunikasi", """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: dua karakter duduk berhadapan. Di antara mereka tidak ada filter — semuanya transparan. Mereka saling menatap, ngomong satu sama lain. Di atas mereka ada 4 langkah untuk fix.

Langkah 1 (ikon telinga dengan kaca pembesar): TANYA BALIK — Jangan langsung asumsi. Kamu tadi bilang X. Maksudnya apa ya? - Clarify. Meta Model question: Nanya spesifik.

Langkah 2 (ikon gelembung bicara dengan checkmark): Ucapkan ulang apa yang kamu dengar — Jadi yang kamu maksud... gitu ya? - Paraphrase. Cek apa yang nyampe sesuai.

Langkah 3 (ikon filter dicoret): SADARI FILTERMU — Aku lagi sedih nih. Mungkin aku deletion. Atau Aku punya pengalaman buruk soal ini. Mungkin aku generalization. - Self-awareness.

Langkah 4 (ikon dua hati): Niat paham — Tanya bukan buat nge-judge. Tapi buat NGERTI. - Curiosity over judgment.

Teks HEADLINE di atas:
"CARA FIX MISKOMUNIKASI (META MODEL IN ACTION)"

Teks penutup:
"Komunikasi yang bener bukan soal siapa yang ngomong paling keras. Tapi siapa yang berusaha NGERTI."

Desain infografis solutif hangat 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: Dua karakter duduk di taman, matahari hangat. Kali ini gak ada filter di antara mereka — semuanya bening. Mereka ngomong santai, ketawa kecil. Di atas mereka ada gelembung kata-kata yang mengalir bolak-balik dengan lancar — ARTI YANG SAMA nyampe ke dua-duanya.

Di samping, karakter ketiga (si "filter") — deletion, distortion, generalization — udah pensiun. Duduk di pojok, diem, megang papan "PENSIUN DINI."

Teks HEADLINE besar font bold di bagian atas:
"KAMU GAK PERNAH DENGER APA YANG SEBENARNYA DIOMONGIN."

Teks body medium:
"Kamu denger apa yang FILTERMU yang izinin."

Teks hook penutup:
"Tapi filter bisa dibersihkan."

Teks closing:
"Mulai hari ini: tanya balik sebelum marah. Pahami sebelum dihakimi. ikon tanaman"

Teks CTA pojok bawah:
"Follow balimentari"

Teks kecil di atas CTA:
"Tag pasanganmu. Inget: dia gak nyebelin. Filter kamu aja 😬"

Desain closing hangat damai empowering.""")

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