#!/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": 6001,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), three people sitting at airport cafe table, tense confrontation, handsome chinese man in center, two beautiful women on either side, one in white trench coat possessive, one in champagne dress calm, dramatic triangle composition, airport background, emotional tension, cinematic lighting, photorealistic, 8k, wide shot",
        "output_prefix": "Drama_EP4_01_Cafe_Confrontation_"
    },
    {
        "id": "02",
        "name": "归还黑卡",
        "seed": 6002,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), woman's hand pushing black credit card across table back to man, determined expression, emotional moment, cafe interior, shallow depth of field, dramatic lighting, photorealistic, 8k, close-up shot, focus on hand and card",
        "output_prefix": "Drama_EP4_02_Return_Card_"
    },
    {
        "id": "03",
        "name": "转身离开",
        "seed": 6003,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese woman in champagne dress walking away from camera, confident stride, airport terminal background, man watching her leave in background, emotional farewell, cinematic composition, photorealistic, 8k, full body shot, from behind",
        "output_prefix": "Drama_EP4_03_Walk_Away_"
    },
    {
        "id": "04",
        "name": "收拾行李",
        "seed": 6004,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), young chinese woman packing clothes into small bag in modern bedroom, tears in eyes, elderly housekeeper watching from doorway, emotional goodbye, warm interior lighting, photorealistic, 8k, medium shot, two characters",
        "output_prefix": "Drama_EP4_04_Packing_Bags_"
    },
    {
        "id": "05",
        "name": "纸条告别",
        "seed": 6005,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handwritten note on marble dining table with black credit card beside it, man's hand picking up note, empty apartment in background, dramatic lighting, emotional moment, photorealistic, 8k, close-up shot, focus on note and card",
        "output_prefix": "Drama_EP4_05_Farewell_Note_"
    },
    {
        "id": "06",
        "name": "陆总震怒",
        "seed": 6006,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man angry, crumpling paper in fist, throwing it on floor, intense expression, modern apartment interior, dramatic chiaroscuro lighting, emotional rage, photorealistic, 8k, medium shot, low angle",
        "output_prefix": "Drama_EP4_06_Angry_Boss_"
    },
    {
        "id": "07",
        "name": "大巴离开",
        "seed": 6007,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), long-distance bus driving away at night, city lights in background, woman looking out window from inside bus, melancholic atmosphere, cinematic lighting, photorealistic, 8k, wide shot, night scene",
        "output_prefix": "Drama_EP4_07_Bus_Departure_"
    },
    {
        "id": "08",
        "name": "再也不见",
        "seed": 6008,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese woman sitting on bus at night, looking out window at passing city lights, tears on face, sad expression, phone in hand, blocked contacts, emotional moment, cinematic lighting, photorealistic, 8k, close-up portrait, shallow depth of field",
        "output_prefix": "Drama_EP4_08_Never_See_Again_"
    }
]

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