#!/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": 7001,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man in office at 3am, holding phone showing blocked contact, red eyes from lack of sleep, standing by floor-to-ceiling window, city night view background, dramatic lighting, emotional distress, photorealistic, 8k, medium shot, chiaroscuro",
        "output_prefix": "Drama_EP5_01_Midnight_Tracking_"
    },
    {
        "id": "02",
        "name": "得知真相",
        "seed": 7002,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man sitting at desk, head in hands, guilty expression, office interior, morning light through window, emotional realization, photorealistic, 8k, close-up portrait, shallow depth of field",
        "output_prefix": "Drama_EP5_02_Learning_Truth_"
    },
    {
        "id": "03",
        "name": "医院守候",
        "seed": 7003,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), young chinese woman sitting by hospital bed, holding elderly grandmother's hand, tears in eyes, hospital room interior, soft morning light, emotional moment, photorealistic, 8k, medium shot, two characters",
        "output_prefix": "Drama_EP5_03_Hospital_Vigil_"
    },
    {
        "id": "04",
        "name": "奶奶询问",
        "seed": 7004,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), elderly chinese grandmother in hospital bed asking question, worried expression, young woman forcing smile, hospital room, emotional conversation, warm lighting, photorealistic, 8k, close-up shot, two generations",
        "output_prefix": "Drama_EP5_04_Grandma_Question_"
    },
    {
        "id": "05",
        "name": "律师出现",
        "seed": 7005,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), black Maybach parked outside hospital, lawyer in black suit getting out of car, holding document folder, woman in casual clothes watching, dramatic confrontation setup, photorealistic, 8k, full body shot, low angle",
        "output_prefix": "Drama_EP5_05_Lawyer_Appears_"
    },
    {
        "id": "06",
        "name": "拒绝工作",
        "seed": 7006,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), young chinese woman throwing document folder back to lawyer, determined expression, hospital entrance background, emotional rejection, dramatic moment, photorealistic, 8k, medium shot, action pose",
        "output_prefix": "Drama_EP5_06_Reject_Job_"
    },
    {
        "id": "07",
        "name": "男主执念",
        "seed": 7007,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man on phone in hotel room, obsessive expression, looking out window, dramatic lighting, emotional determination, photorealistic, 8k, medium shot, side profile",
        "output_prefix": "Drama_EP5_07_Obsession_"
    },
    {
        "id": "08",
        "name": "三年后预告",
        "seed": 7008,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese woman in elegant designer dress on award stage, holding trophy, confident smile, three years later, success story, dramatic stage lighting, photorealistic, 8k, full body shot, low angle, inspirational",
        "output_prefix": "Drama_EP5_08_Three_Years_Later_"
    }
]

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_EP5_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()
