#!/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": 11001,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), beautiful chinese woman waking up in bed, holding phone with message, blushing expression, morning sunlight through window, bedroom interior, romantic atmosphere, photorealistic, 8k, close-up portrait, shallow depth of field",
        "output_prefix": "Drama_EP9_01_Morning_Message_"
    },
    {
        "id": "02",
        "name": "办公室商议",
        "seed": 11002,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man and beautiful chinese woman in office, intimate conversation, man holding woman's hand, professional attire, office background, romantic tension, warm lighting, photorealistic, 8k, medium shot, two characters",
        "output_prefix": "Drama_EP9_02_Office_Discussion_"
    },
    {
        "id": "03",
        "name": "到达陆家",
        "seed": 11003,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), elegant traditional Chinese mansion exterior, couple standing at entrance, woman nervous holding man's hand, daytime, wealthy family home, cinematic lighting, photorealistic, 8k, wide shot",
        "output_prefix": "Drama_EP9_03_Arriving_At_Home_"
    },
    {
        "id": "04",
        "name": "初次见面",
        "seed": 11004,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), elegant middle-aged Chinese woman opening door, greeting young couple, traditional home interior, warm lighting, polite atmosphere, photorealistic, 8k, medium shot, three characters",
        "output_prefix": "Drama_EP9_04_First_Meeting_"
    },
    {
        "id": "05",
        "name": "客厅尴尬",
        "seed": 11005,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), family living room scene, elderly man reading newspaper on sofa, young couple sitting nervously, awkward atmosphere, traditional Chinese home, warm lighting, photorealistic, 8k, wide shot",
        "output_prefix": "Drama_EP9_05_Awkward_Living_Room_"
    },
    {
        "id": "06",
        "name": "晚餐对峙",
        "seed": 11006,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), family dinner table, four people sitting, tense atmosphere, young woman nervous, traditional Chinese dining room, candlelight, dramatic lighting, photorealistic, 8k, wide shot",
        "output_prefix": "Drama_EP9_06_Dinner_Confrontation_"
    },
    {
        "id": "07",
        "name": "男主维护",
        "seed": 11007,
        "width": 832,
        "height": 1216,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man speaking firmly at dinner table, determined expression, defending his girlfriend, dramatic lighting, emotional moment, photorealistic, 8k, close-up portrait, intense eyes",
        "output_prefix": "Drama_EP9_07_Boyfriend_Defends_"
    },
    {
        "id": "08",
        "name": "花园告白",
        "seed": 11008,
        "width": 1216,
        "height": 832,
        "prompt": "(masterpiece, best quality, ultra-detailed:1.3), couple embracing in garden at night, moonlight, romantic atmosphere, man holding woman tightly, happy expressions, garden setting, night scene, photorealistic, 8k, medium shot, intimate moment",
        "output_prefix": "Drama_EP9_08_Garden_Confession_"
    }
]

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