import json, urllib.request, urllib.error, time, os

API_KEY = "vio_sk_vA8llIYm51J3oyXtfevrM92yUBJ8-3IS1sIn6xydF8o"
BASE = "https://api.viostudio.id/v1"

scenes = [
    {"id": 1, "image": "/app/working/workspaces/default/balimentari-s1-v2.jpg", "prompt": "Karakter chibi Surya mengedip pelan dengan gerakan napas yang tenang dan lembut. Text COBA TEKNIK INI SEKARANG muncul dengan lembut. Subtle animation breathed motion untuk konten kesehatan mental yang menenangkan.", "output": "/app/working/workspaces/default/balimentari-video-scene1.mp4"},
    {"id": 2, "image": "/app/working/workspaces/default/balimentari-s2-v2.jpg", "prompt": "Lingkaran napas di tengah layar berkembang dan menguncup dengan ritme yang tenang dan berulang. Karakter Surya mengikuti gerakan napas dengan lembut dan peaceful. Smooth breathing animation yang menenangkan dan hypnotic.", "output": "/app/working/workspaces/default/balimentari-video-scene2.mp4"},
    {"id": 3, "image": "/app/working/workspaces/default/balimentari-s3-v2.jpg", "prompt": "Karakter Surya dengan ekspresi zen dan tenang глаза half-closed. Teks INI CARANYA muncul pelan. Diagram perlahan berubah dari aktif ke tenang dengan arrow animation yang smooth dan menenangkan.", "output": "/app/working/workspaces/default/balimentari-video-scene3.mp4"},
    {"id": 4, "image": "/app/working/workspaces/default/balimentari-s4-v2.jpg", "prompt": "Karakter Surya dengan senyum lebar dan thumbs up. Text MULAI SEKARANG muncul dengan energetic tapi tetap warm. Gentle breathing motion untuk closing yang inspiring dan motivating.", "output": "/app/working/workspaces/default/balimentari-video-scene4.mp4"},
]

# Step 1: Upload all images as assets
print("📤 Uploading images as assets...")
asset_ids = []
for scene in scenes:
    boundary = '----FormBoundary7MA4YWxkTrZu0gW'
    with open(scene["image"], 'rb') as f:
        image_bytes = f.read()
    
    body = (
        f'------{boundary}\r\n'
        f'Content-Disposition: form-data; name="file"; filename="scene{scene["id"]}.jpg"\r\n'
        f'Content-Type: image/jpeg\r\n\r\n'
    ).encode('utf-8') + image_bytes + f'\r\n------{boundary}--\r\n'.encode('utf-8')
    
    req = urllib.request.Request(
        f'{BASE}/assets',
        data=body,
        headers={
            'Authorization': f'Bearer {API_KEY}',
            'Content-Type': f'multipart/form-data; boundary=----{boundary}',
            'User-Agent': 'Mozilla/5.0'
        },
        method='POST'
    )
    
    with urllib.request.urlopen(req, timeout=30) as resp:
        result = json.loads(resp.read())
        asset_id = result.get('asset_id')
        asset_ids.append(asset_id)
        print(f"  Scene {scene['id']} - Asset ID: {asset_id}")

# Step 2: Generate videos for all scenes
print("\n🎬 Generating videos...")
for i, scene in enumerate(scenes):
    print(f"\n📹 Scene {scene['id']}...")
    
    payload = {
        "prompt": scene["prompt"],
        "mode": "i2v",
        "model": "veo-3.1-lite",
        "aspect_ratio": "portrait",
        "count": 1,
        "start_frame_asset_id": asset_ids[i]
    }
    
    req = urllib.request.Request(
        f'{BASE}/videos/generate',
        data=json.dumps(payload).encode(),
        headers={
            'Authorization': f'Bearer {API_KEY}',
            'Content-Type': 'application/json',
            'User-Agent': 'Mozilla/5.0'
        },
        method='POST'
    )
    
    with urllib.request.urlopen(req, timeout=30) as resp:
        result = json.loads(resp.read())
        gen_id = result.get('generation_ids', [0])[0]
        print(f"  Queued! ID: {gen_id}")
        
        # Poll for result
        while True:
            time.sleep(10)
            status_req = urllib.request.Request(
                f'{BASE}/generations/{gen_id}',
                headers={'Authorization': f'Bearer {API_KEY}', 'User-Agent': 'Mozilla/5.0'}
            )
            with urllib.request.urlopen(status_req, timeout=15) as sr:
                status = json.loads(sr.read())
                s = status.get('status')
                print(f"  Status: {s}")
                
                if s == 'completed':
                    url = status.get('asset_url')
                    print(f"  ✅ DONE! URL: {url}")
                    
                    # Download
                    dl_req = urllib.request.Request(url)
                    with urllib.request.urlopen(dl_req, timeout=30) as dl:
                        with open(scene["output"], 'wb') as out:
                            out.write(dl.read())
                    print(f"  💾 Saved to: {scene['output']}")
                    break
                elif s == 'failed':
                    print(f"  ❌ FAILED: {status.get('error_message')}")
                    break
                time.sleep(8)

print("\n🎉 ALL VIDEOS DONE!")
