#!/usr/bin/env python3
"""短剧《雨夜撞上陆总后》第十集 - 场景图生成"""

import json, urllib.request, time

COMFYUI_URL = "http://127.0.0.1:8188"
BEST_MODEL = "SDXL 1.0\\9527DetailRealistic_v30.safetensors"
NEGATIVE_PROMPT = "(worst quality, low quality:1.4), deformed, distorted, disfigured, bad anatomy, bad proportions, ugly, noisy, blurry, low contrast, watermark, text, signature, cartoon, anime, 3d, painting, drawing, illustration, western features, blue eyes, blonde hair, extra fingers, malformed hands, missing limbs, floating limbs, disconnected limbs, nsfw, nude, naked"

SCENES = [
    {"id": "01", "name": "婚礼讨论", "seed": 12001, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), family sitting in elegant living room, discussing wedding plans, chinese family, warm atmosphere, interior design, photorealistic, 8k, wide shot", "output_prefix": "Drama_EP10_01_Wedding_Discussion_"},
    {"id": "02", "name": "办公室策划", "seed": 12002, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man and beautiful chinese woman in office, looking at wedding planner book together, romantic atmosphere, office background, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP10_02_Office_Planning_"},
    {"id": "03", "name": "海边婚礼方案", "seed": 12003, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), wedding planner book open showing beach wedding design, beautiful illustrations, elegant layout, close-up shot, photorealistic, 8k", "output_prefix": "Drama_EP10_03_Beach_Plan_"},
    {"id": "04", "name": "婚纱店迎接", "seed": 12004, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), elegant bridal shop interior, designer greeting couple, luxury setting, warm lighting, photorealistic, 8k, wide shot", "output_prefix": "Drama_EP10_04_Bridal_Shop_"},
    {"id": "05", "name": "第一件婚纱", "seed": 12005, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese woman in white wedding dress standing in front of mirror, elegant pose, bridal shop, soft lighting, photorealistic, 8k, full body shot", "output_prefix": "Drama_EP10_05_First_Dress_"},
    {"id": "06", "name": "完美婚纱", "seed": 12006, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese woman in stunning A-line wedding dress with lace details, looking at mirror, emotional moment, bridal shop, photorealistic, 8k, full body shot", "output_prefix": "Drama_EP10_06_Perfect_Dress_"},
    {"id": "07", "name": "背后拥抱", "seed": 12007, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man hugging woman from behind in bridal shop, both in wedding attire, romantic moment, mirror reflection, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP10_07_Back_Hug_"},
    {"id": "08", "name": "月光相拥", "seed": 12008, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), couple embracing at home at night, moonlight through window, romantic atmosphere, intimate moment, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP10_08_Moonlight_Embrace_"}
]

def submit_prompt(scene):
    prompt_data = {"prompt": {"3": {"class_type": "KSampler", "inputs": {"cfg": 7.0, "denoise": 1, "latent_image": ["5", 0], "model": ["4", 0], "negative": ["7", 0], "positive": ["6", 0], "sampler_name": "dpmpp_2m", "scheduler": "karras", "seed": scene["seed"], "steps": 30}}, "4": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": BEST_MODEL}}, "5": {"class_type": "EmptyLatentImage", "inputs": {"batch_size": 1, "height": scene["height"], "width": scene["width"]}}, "6": {"class_type": "CLIPTextEncode", "inputs": {"clip": ["4", 1], "text": scene["prompt"]}}, "7": {"class_type": "CLIPTextEncode", "inputs": {"clip": ["4", 1], "text": NEGATIVE_PROMPT}}, "8": {"class_type": "VAEDecode", "inputs": {"samples": ["3", 0], "vae": ["4", 2]}}, "9": {"class_type": "SaveImage", "inputs": {"filename_prefix": scene["output_prefix"], "images": ["8", 0]}}}}
    try:
        req = urllib.request.Request(f'{COMFYUI_URL}/prompt', data=json.dumps(prompt_data).encode('utf-8'), headers={'Content-Type': 'application/json'}, method='POST')
        with urllib.request.urlopen(req, timeout=10) as response:
            result = json.loads(response.read().decode('utf-8'))
            return True, result.get('prompt_id', 'unknown')
    except Exception as e:
        return False, str(e)

def main():
    print("=" * 70)
    print("🎬 短剧《雨夜撞上陆总后》第十集 - 场景图生成")
    print("=" * 70)
    print(f"\n📦 使用模型：{BEST_MODEL}")
    print(f"📊 场景数量：{len(SCENES)} 个")
    print("=" * 70)
    print("\n📡 检查 ComfyUI 连接...")
    try:
        req = urllib.request.Request(f'{COMFYUI_URL}/queue', method='GET')
        with urllib.request.urlopen(req, timeout=5) as response:
            queue = json.loads(response.read().decode('utf-8'))
            print(f"✅ ComfyUI 连接成功")
            print(f"   当前队列：{len(queue.get('queue_running', []))} 运行中，{len(queue.get('queue_pending', []))} 等待中")
    except Exception as e:
        print(f"❌ 无法连接 ComfyUI: {e}")
        return
    print("\n" + "=" * 70)
    print("🚀 开始提交生成任务...")
    print("=" * 70)
    success_count = 0
    for i, scene in enumerate(SCENES, 1):
        print(f"\n[{i}/{len(SCENES)}] {scene['name']}")
        success, result = submit_prompt(scene)
        if success:
            print(f"   ✅ 提交成功 (Prompt ID: {result})")
            success_count += 1
        else:
            print(f"   ❌ 提交失败：{result}")
        time.sleep(0.5)
    print("\n" + "=" * 70)
    print("📊 生成结果")
    print("=" * 70)
    print(f"✅ 成功：{success_count}/{len(SCENES)}")
    if success_count > 0:
        print(f"\n💾 图片将保存到：ComfyUI/output/")
        print(f"   文件名前缀：Drama_EP10_XX_场景名_")
        print(f"\n🌐 查看进度：http://127.0.0.1:8188")
    print("\n" + "=" * 70)
    print("\n📋 场景清单:")
    print("-" * 70)
    for scene in SCENES:
        print(f"  {scene['id']}. {scene['name']} - {scene['output_prefix']}")
    print("-" * 70)

if __name__ == "__main__":
    main()
