#!/usr/bin/env python3
from __future__ import annotations

import json
import os
import re
import subprocess
from datetime import datetime
from pathlib import Path

PROJECT = Path('/Users/bot1/Volumes/root_for_ai/AI工作区/通用_产品宣传视频_古钱币杜邦纸钱袋包_20260530_1702')
PROMPT_MD = PROJECT / 'deliverables/storyboard_sheets_20260530/动态视频提示词_按4组分镜_20260530.md'
OUT_DIR = PROJECT / 'outputs/dreamina-seedance2-full-20260530_194640'
BIN = '/Users/bot1/.hermes/profiles/video/home/.local/bin/dreamina'
IMAGES = [
    PROJECT / 'deliverables/storyboard_sheets_20260530/合并分镜1_2x2.png',
    PROJECT / 'deliverables/storyboard_sheets_20260530/合并分镜2_2x2.png',
    PROJECT / 'deliverables/storyboard_sheets_20260530/合并分镜3_2x2.png',
    PROJECT / 'deliverables/storyboard_sheets_20260530/合并分镜4_2x2.png',
]

OUT_DIR.mkdir(parents=True, exist_ok=True)
text = PROMPT_MD.read_text(encoding='utf-8')
marker = '# 可选：整条连续视频提交稿'
if marker not in text:
    raise SystemExit(f'marker not found in {PROMPT_MD}')
body = text.split(marker, 1)[1]
# Keep the confirmed complete-video prompt section, remove markdown heading noise.
body = re.sub(r'^\s*-+\s*$', '', body, flags=re.M)
body = body.strip()

prompt = f"""使用以下4张合并分镜图作为镜头顺序参考：合并分镜1、合并分镜2、合并分镜3、合并分镜4。它们只是顺序参考，成片必须是连续单画面视频，不要出现九宫格、2x2分镜板、拼贴图、画中画、边框或文字说明。请按左上、右上、左下、右下读取每张分镜内的动作顺序，但输出时自然连接成电影式连续镜头。

{body}

补充执行要求：
- 画面比例必须为3:4竖版，时长控制在15秒以内。
- 只生成环境声和动作音效，不生成背景音乐，不生成旋律型BGM。
- 保持古钱币种类差异：灰银桥形币、金色贝壳状币、绿色长柄铲形币、圆形方孔币、金色裂纹圆片、黑色椭圆刻纹币等不要被统一成同一种钱币。
- 保持黄色杜邦纸钱袋包的产品结构：黄色织物质感、椭圆手提孔、棕色肩带、金属环扣、包身圆点和钱币形纹样。
""".strip()

prompt_path = OUT_DIR / 'confirmed_prompt_full_video.txt'
prompt_path.write_text(prompt, encoding='utf-8')

for p in IMAGES:
    if not p.exists():
        raise SystemExit(f'missing image: {p}')

cmd = [
    BIN, 'multimodal2video',
    '--model_version', 'seedance2.0_vip',
    '--video_resolution', '1080p',
    '--duration', '15',
    '--ratio', '3:4',
    '--poll', '30',
]
for img in IMAGES:
    cmd += ['--image', str(img)]
cmd += ['--prompt', prompt]

run_info = {
    'created_at': datetime.now().astimezone().isoformat(),
    'out_dir': str(OUT_DIR),
    'prompt_path': str(prompt_path),
    'images': [str(p) for p in IMAGES],
    'model_version': 'seedance2.0_vip',
    'video_resolution': '1080p',
    'duration': 15,
    'ratio': '3:4',
    'command_argv_redacted': cmd[:-1] + ['<prompt omitted; see confirmed_prompt_full_video.txt>'],
}
(OUT_DIR / 'submit_run_info.json').write_text(json.dumps(run_info, ensure_ascii=False, indent=2), encoding='utf-8')

env = os.environ.copy()
env['HOME'] = '/Users/bot1'
res = subprocess.run(cmd, env=env, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
(OUT_DIR / 'submit_stdout.log').write_text(res.stdout, encoding='utf-8')
status = {
    'completed_at': datetime.now().astimezone().isoformat(),
    'returncode': res.returncode,
    'stdout_log': str(OUT_DIR / 'submit_stdout.log'),
}
# Try extracting submit_id/gen_status if present in JSON or plain text.
submit_id_match = re.search(r'"submit_id"\s*:\s*"([^"]+)"|submit_id[=:]\s*([A-Za-z0-9_\-]+)', res.stdout)
if submit_id_match:
    status['submit_id'] = next(g for g in submit_id_match.groups() if g)
gen_status_match = re.search(r'"gen_status"\s*:\s*"([^"]+)"|gen_status[=:]\s*([A-Za-z_\-]+)', res.stdout)
if gen_status_match:
    status['gen_status'] = next(g for g in gen_status_match.groups() if g)
(OUT_DIR / 'submit_status.json').write_text(json.dumps(status, ensure_ascii=False, indent=2), encoding='utf-8')
print(json.dumps(status, ensure_ascii=False, indent=2))
print('--- DREAMINA OUTPUT ---')
print(res.stdout)
raise SystemExit(res.returncode)
