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['slide1'] = generate("LL | Slide 1 - Cover", """Instagram carousel cover slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style.

Background gradasi soft cream ke deep teal blue. Nuansa bold mind-blowing.

Ilustrasi: Karakter berdiri di tengah, frustasi. Di sekelilingnya ada 6 level bertumpuk seperti piramida terbalik atau tangga, dari bawah ke atas:

Level 1 (bawah): ENVIRONMENT — ikon rumah, kantor, temen-temen.
Level 2: BEHAVIOR — ikon alarm pagi, treadmill, buku.
Level 3: CAPABILITIES — ikon skill, otak.
Level 4: BELIEFS — ikon keyakinan, quote bubbles.
Level 5: IDENTITY — ikon cermin: "Gue siapa?"
Level 6 (atas): PURPOSE — ikon bintang: "Buat apa?"

Karakter selama ini cuma ngotak-atik level 2 (behavior): bangun pagi, diet, belajar. Tapi level 1 (environment) dan level 4 (beliefs) gak berubah. Hasilnya: MENTOK TERUS.

Teks HOOK besar:
LOGICAL LEVELS

Teks hook lanjutan:
KENAPA GANTI KEBIASAAN SUSAH, TAPI PINDAH KOTA LANGSUNG BERUBAH?

Desain bold struktural mind-blowing.""")

urls['slide2'] = generate("LL | Slide 2 - 6 Level Perubahan", """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: Piramida 6 level dari bawah ke atas:

Level 1 (ikon lokasi): ENVIRONMENT — Di mana? Sama siapa? Kapan? Lo ada di lingkungan yang gak mendukung perubahan lo?

Level 2 (ikon orang berjalan): BEHAVIOR — Apa yang lo lakuin? Bangun pagi? Olahraga? Belajar? Ini yang paling sering lo ubah — tapi paling gampang balik lagi.

Level 3 (ikon otak + gear): CAPABILITIES — Bisa apa? Skill? Strategi? Gimana caranya?

Level 4 (ikon hati + gelembung): BELIEFS & VALUES — Lo percaya apa? "Gue bisa berubah" atau "Gue gini-gini aja"? Ini kunci. Level ini yang nentuin behavior nempel atau enggak.

Level 5 (ikon cermin): IDENTITY — Lo siapa? "Gue orang yang disiplin" atau "Gue orang males"? Identitas ngedikte semua level di bawahnya.

Level 6 (ikon bintang): PURPOSE — Buat apa sih? Tujuan gede lo? Kalo purpose gak jelas, semua level di bawah goyah.

Teks HEADLINE bold:
6 LEVEL PERUBAHAN LOGICAL LEVELS

Teks penutup:
Semakin tinggi level yang lo ubah, semakin DALAM dan PERMANEN perubahannya. Tapi orang kebanyakan cuma ngotak-atik level 1-2 doang.

Desain infografis edukatif.""")

urls['slide3'] = generate("LL | Slide 3 - Ngubah Behavior Gagal", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

Background gradasi soft cream ke deep teal blue.

Ilustrasi: Panel komik 3 bagian:

Panel 1: Januari — Karakter semangat. Alarm jam 5 pagi. Buku di samping. Post-it: TAHUN BARU GUE BERUBAH! Di sekitarnya, temen-temennya masih begadang main game. Label: Environment gak berubah.

Panel 2: Februari — Karakter udah mulai lesu. Alarm jam 5 udah di-snooze. Temen-temen masih begadang. Dia mulai ikutan lagi. Label: Behavior balik.

Panel 3: Maret — Karakter balik ke kebiasaan lama. Di kepalanya: "Yah gue emang gak bisa berubah." Label: Belief jadi: gue gak bisa.

Di bawah panel: LO CUMA NGOTAK-ATIK BEHAVIOR. ENVIRONMENT & BELIEF GAK LO SENTUH. YA BALIK LAGI.

Teks HEADLINE bold:
LO UBAH BEHAVIOR. TAPI LEVEL LAIN GAK LO SENTUH. YA GAGAL.

Desain komik relatable lucu nusuk.""")

urls['slide4'] = generate("LL | Slide 4 - Lingkungan Berubah Lo Berubah", """Instagram carousel slide 3:4 aspect ratio ukuran feed Instagram. Flat vector illustration style komik.

Background gradasi soft cream ke deep teal blue.

Ilustrasi: Split panel kiri-kanan.

PANEL KIRI: Karakter di kota lama. Lingkungan: temen nongki tiap malem, keluarga skeptis, kantor toxic. Behavior: udah coba bangun pagi 100x — gagal. Label: ENVIRONMENT TETAP. GAGAL.

PANEL KANAN: Karakter yang SAMA, pindah kota baru. Lingkungan: temen-temen produktif, komunitas positif, kantor baru. Behavior: otomatis berubah — bangun pagi, semangat, disiplin. Label: ENVIRONMENT BERUBAH. BERHASIL.

Di tengah: panah besar. BUKAN LO YANG LEMAH. LEVEL ENVIRONMENT LO YANG GAK NDUKUNG.

Teks HEADLINE bold:
PINDAH KOTA. LO BERUBAH TOTAL. KOK BISA?

Teks penjelasan:
Karena environment (Level 1) ngedikte behavior (Level 2). Kalo lo cuma ubah behavior tanpa ubah environment — lo lawan gravitasi tiap hari. Capek sendiri.

Desain komik insight.""")

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