#!/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-four-segments-20260530'
BIN = '/Users/bot1/.hermes/profiles/video/home/.local/bin/dreamina'

GLOBAL = """视频规格：15秒，3:4竖版，连续单画面。
声音要求：只生成环境声和动作音效，不生成背景音乐，不生成旋律型BGM。
分镜使用规则：本任务只使用当前这一张合并分镜图作为唯一顺序参考；按2x2分镜的左上、右上、左下、右下理解动作顺序，但成片必须自然连接成连续单画面视频。
禁止：不要九宫格、不要2x2分镜板、不要拼贴图、不要画中画、不要边框、不要文字说明、不要UI、不要水印。"""

text = PROMPT_MD.read_text(encoding='utf-8')
OUT_DIR.mkdir(parents=True, exist_ok=True)

segments = []
for n in range(1, 5):
    img = PROJECT / f'deliverables/storyboard_sheets_20260530/合并分镜{n}_2x2.png'
    if not img.exists():
        raise SystemExit(f'missing image for segment {n}: {img}')
    m = re.search(rf'(?ms)^# 分镜{n}｜.*?(?=^# 分镜{n+1}｜|^# 可选：整条连续视频提交稿|\Z)', text)
    if not m:
        raise SystemExit(f'missing prompt section for segment {n}')
    sec = m.group(0).strip()
    title = sec.splitlines()[0].lstrip('# ').strip()
    prompt_m = re.search(r'(?ms)^## 动态视频提示词\n\n(.*?)(?=^### 保真要求)', sec)
    fidelity_m = re.search(r'(?ms)^### 保真要求\n\n(.*?)(?=^### 避免)', sec)
    avoid_m = re.search(r'(?ms)^### 避免\n\n(.*?)(?=^---|\Z)', sec)
    body = prompt_m.group(1).strip() if prompt_m else ''
    fidelity = fidelity_m.group(1).strip() if fidelity_m else ''
    avoid = avoid_m.group(1).strip() if avoid_m else ''
    final_prompt = f"""{GLOBAL}

当前视频段：视频{n:02d}｜{title}
唯一参考图：合并分镜{n}_2x2.png。不要参考其他分镜图，不要把其他段落的内容提前或混入本段。

{body}

保真要求：
{fidelity}

避免：
{avoid}
""".strip()
    seg_dir = OUT_DIR / f'segment_{n:02d}'
    seg_dir.mkdir(parents=True, exist_ok=True)
    prompt_path = seg_dir / f'prompt_segment_{n:02d}.txt'
    prompt_path.write_text(final_prompt, encoding='utf-8')
    segments.append({
        'segment': n,
        'title': title,
        'image': str(img),
        'prompt_path': str(prompt_path),
        'out_dir': str(seg_dir),
        'download_dir': str(seg_dir / 'downloads'),
    })

manifest_path = OUT_DIR / 'four_segment_submit_manifest.json'
manifest_path.write_text(json.dumps({
    'created_at': datetime.now().astimezone().isoformat(),
    'source_prompt_file': str(PROMPT_MD),
    'model_version': 'seedance2.0_vip',
    'video_resolution': '1080p',
    'duration': 15,
    'ratio': '3:4',
    'segments': segments,
}, ensure_ascii=False, indent=2), encoding='utf-8')
print('MANIFEST', manifest_path)

results = []
for seg in segments:
    n = seg['segment']
    prompt = Path(seg['prompt_path']).read_text(encoding='utf-8')
    cmd = [
        BIN, 'multimodal2video',
        '--image', seg['image'],
        '--prompt', prompt,
        '--duration', '15',
        '--ratio', '3:4',
        '--video_resolution', '1080p',
        '--model_version', 'seedance2.0_vip',
        '--poll', '20',
    ]
    seg_dir = Path(seg['out_dir'])
    (seg_dir / 'submit_command_redacted.json').write_text(json.dumps(cmd[:-1] + ['<prompt in prompt_segment file>'], ensure_ascii=False, indent=2), encoding='utf-8')
    print(f'\n===== SUBMIT SEGMENT {n:02d} =====')
    print('IMAGE:', seg['image'])
    print('PROMPT:', seg['prompt_path'])
    env = os.environ.copy()
    env['HOME'] = '/Users/bot1'
    res = subprocess.run(cmd, env=env, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    stdout_path = seg_dir / 'submit_stdout.log'
    stdout_path.write_text(res.stdout, encoding='utf-8')
    submit_id = None
    gen_status = None
    m_id = re.search(r'"submit_id"\s*:\s*"([^"]+)"|submit_id[=:]\s*([A-Za-z0-9_\-]+)', res.stdout)
    if m_id:
        submit_id = next(g for g in m_id.groups() if g)
    m_status = re.search(r'"gen_status"\s*:\s*"([^"]+)"|gen_status[=:]\s*([A-Za-z_\-]+)', res.stdout)
    if m_status:
        gen_status = next(g for g in m_status.groups() if g)
    m_credit = re.search(r'"credit_count"\s*:\s*([0-9]+)', res.stdout)
    credit_count = int(m_credit.group(1)) if m_credit else None
    obj = {
        **seg,
        'submitted_at': datetime.now().astimezone().isoformat(),
        'returncode': res.returncode,
        'submit_id': submit_id,
        'gen_status': gen_status,
        'credit_count': credit_count,
        'stdout_log': str(stdout_path),
    }
    (seg_dir / 'submit_status.json').write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding='utf-8')
    results.append(obj)
    print(json.dumps(obj, ensure_ascii=False, indent=2))
    if res.returncode != 0 or not submit_id or gen_status == 'fail':
        print(res.stdout)
        raise SystemExit(res.returncode or 2)

(OUT_DIR / 'submit_results.json').write_text(json.dumps({
    'updated_at': datetime.now().astimezone().isoformat(),
    'results': results,
}, ensure_ascii=False, indent=2), encoding='utf-8')
print('\nALL_SUBMITTED')
print(json.dumps(results, ensure_ascii=False, indent=2))
