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

import json
import urllib.request
import 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"

# 第三集关键场景 (8 个)
SCENES = [
    {
        "id": "01",
        "name": "手术成功",
        "seed": 5001,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful young chinese woman sitting on bed in morning light, talking on phone, tears streaming down face, covering mouth to suppress cry, white pajamas, emotional relief, soft window light, bedroom background, photorealistic, 8k, close-up portrait, shallow depth of field",
        "output_prefix": "Drama_EP3_01_Surgery_Success_"
    },
    {
        "id": "02",
        "name": "黑卡羞辱",
        "seed": 5002,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man in grey loungewear giving black credit card to woman, man's hand extended, woman's hand trembling, emotional tension, modern apartment interior, morning light, dramatic moment, photorealistic, 8k, medium shot, focus on hands and card",
        "output_prefix": "Drama_EP3_02_Black_Card_Humiliation_"
    },
    {
        "id": "03",
        "name": "新闻播报",
        "seed": 5003,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), TV screen showing news broadcast, beautiful chinese female celebrity in white trench coat at airport, news ticker text in Chinese, woman watching TV in shock, remote control dropped on floor, living room setting, dramatic tension, photorealistic, 8k, wide shot",
        "output_prefix": "Drama_EP3_03_News_Broadcast_"
    },
    {
        "id": "04",
        "name": "王妈劝说",
        "seed": 5004,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), elderly Chinese housekeeper talking to young woman in living room, housekeeper holding gift box with clothes, young woman looking down with bitter smile, emotional conversation, warm interior lighting, modern apartment, photorealistic, 8k, medium shot, two characters",
        "output_prefix": "Drama_EP3_04_Housekeeper_Advice_"
    },
    {
        "id": "05",
        "name": "机场等待",
        "seed": 5005,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), airport VIP terminal with crowd of reporters and photographers, cameras flashing, handsome chinese man in black suit standing nervously, beautiful chinese woman beside him looking anxious, anticipation, dramatic lighting, photorealistic, 8k, wide shot, crowd scene",
        "output_prefix": "Drama_EP3_05_Airport_Waiting_"
    },
    {
        "id": "06",
        "name": "白月光登场",
        "seed": 5006,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese actress in white trench coat walking through airport terminal, designer sunglasses, confident smile, rolling luggage behind, celebrity arrival, paparazzi flashes, dramatic entrance, cinematic lighting, photorealistic, 8k, full body shot, low angle",
        "output_prefix": "Drama_EP3_06_White_Moonlight_Arrival_"
    },
    {
        "id": "07",
        "name": "三人对峙",
        "seed": 5007,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), three people confrontation at airport, handsome man in center, two beautiful women on either side, one in white trench coat with tears, one in champagne dress looking hurt, dramatic triangle composition, emotional tension, airport background, photorealistic, 8k, wide shot, cinematic",
        "output_prefix": "Drama_EP3_07_Triangle_Confrontation_"
    },
    {
        "id": "08",
        "name": "别走",
        "seed": 5008,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), man's hand grabbing woman's wrist desperately, woman turning back with tearful eyes, emotional moment, airport background blurred, dramatic lighting, shallow depth of field, romantic tension, photorealistic, 8k, close-up shot, focus on hands and faces",
        "output_prefix": "Drama_EP3_08_Dont_Go_"
    }
]

def submit_prompt(scene):
    """提交单个场景到 ComfyUI"""
    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)
    
    # 检查 ComfyUI 连接
    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_EP3_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()
