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

import json
import urllib.request
import time
import os

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": 4001,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful young chinese woman waking up in luxury bedroom, morning sunlight through floor-to-ceiling windows, white silk nightgown, messy hair, confused expression, holding her head, expensive furniture in background, soft warm lighting, photorealistic, 8k, medium shot, shallow depth of field",
        "output_prefix": "Drama_EP2_01_Morning_Wake_"
    },
    {
        "id": "02",
        "name": "黑卡便签",
        "seed": 4002,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), close-up of black credit card and handwritten note on marble nightstand, card shows name '陆景深', note says '下午三点，造型师会来', delicate woman's hand reaching for card, morning light, shallow depth of field, photorealistic, 8k, macro shot",
        "output_prefix": "Drama_EP2_02_Black_Card_"
    },
    {
        "id": "03",
        "name": "造型挑选",
        "seed": 4003,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), three stylists with luggage cases in modern living room, opening cases to reveal haute couture gowns, young chinese woman in white nightgown watching, feeling out of place, luxury penthouse interior, bright daylight, photorealistic, 8k, wide shot",
        "output_prefix": "Drama_EP2_03_Stylist_Selection_"
    },
    {
        "id": "04",
        "name": "香槟礼服",
        "seed": 4004,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), champagne colored strapless evening gown held up by stylist, sparkling fabric, elegant and simple design, luxury haute couture, soft lighting, fashion photography style, photorealistic, 8k, close-up of dress",
        "output_prefix": "Drama_EP2_04_Champagne_Dress_"
    },
    {
        "id": "05",
        "name": "楼梯相遇",
        "seed": 4005,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese woman in champagne gown walking down grand staircase, elegant updo hairstyle, refined makeup, handsome chinese man in black suit looking up from bottom of stairs, dramatic lighting, romantic tension, cinematic, photorealistic, 8k, low angle shot",
        "output_prefix": "Drama_EP2_05_Stairs_Meeting_"
    },
    {
        "id": "06",
        "name": "红毯官宣",
        "seed": 4006,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), red carpet event at luxury hotel, photographers with cameras flashing, handsome man in tuxedo helping woman in champagne gown out of black Maybach, his hand on her waist, paparazzi frenzy, night scene, dramatic lighting, photorealistic, 8k, wide shot",
        "output_prefix": "Drama_EP2_06_Red_Carpet_"
    },
    {
        "id": "07",
        "name": "洗手间羞辱",
        "seed": 4007,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), reflection in bathroom mirror, young chinese woman applying makeup, another woman in red dress standing behind her with malicious smile, confrontation scene, dramatic lighting, emotional tension, photorealistic, 8k, mirror reflection shot",
        "output_prefix": "Drama_EP2_07_Bathroom_Confrontation_"
    },
    {
        "id": "08",
        "name": "深夜照片",
        "seed": 4008,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man standing by window at night, holding old photograph, photo shows young woman waving at airport, city lights in background, melancholic expression, dramatic chiaroscuro lighting, cinematic, photorealistic, 8k, medium shot",
        "output_prefix": "Drama_EP2_08_Photo_Memory_"
    }
]

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