"""Stage 1B 데이터를 고정 입력으로, pipeline.py의 generate_slide()를 사용.

Kei persona 관여 부분(1A, 1B)을 건너뛰고
나머지 파이프라인(1.5a~4)을 그대로 실행.

pipeline.py를 직접 수정하지 않고, manual_layout 파라미터로 Stage 1A를 고정.
Stage 1B(structured_text)도 고정.

사용법:
    python scripts/run_from_stage1b.py data/runs/20260403_133746
"""
import asyncio
import json
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))


async def main(run_dir: str):
    run = Path(run_dir)

    # Stage 1B context 로드
    ctx_json = json.loads((run / "stage_1b_context.json").read_text(encoding="utf-8"))
    # MDX 원본: context에서 가져옴 (어떤 MDX든 대응)
    raw_content = ctx_json.get("raw_content", "")

    # Stage 1A 결과를 manual_layout으로 전달 (Stage 1A 스킵)
    # page_structure가 {"roles": {...}} 형태이면 roles 안쪽을 직접 전달
    ps = ctx_json["page_structure"]
    if "roles" in ps:
        ps = ps["roles"]

    manual_layout = {
        "topics": ctx_json["topics"],
        "page_structure": ps,
        "core_message": ctx_json.get("analysis", {}).get("core_message", ""),
        "title": ctx_json.get("analysis", {}).get("title", ""),
        "layout_template": ctx_json.get("analysis", {}).get("layout_template", "A"),
    }

    layout = manual_layout.get("layout_template", "A")
    print(f"=== Stage 1B 데이터 고정: {run.name} (유형 {layout}) ===")
    print(f"  topics: {len(ctx_json['topics'])}개")
    for t in ctx_json["topics"]:
        print(f"    꼭지{t['id']}: {t['title']} (st={len(t.get('structured_text',''))}자)")

    # pipeline.py의 generate_slide() 호출
    from src.pipeline import generate_slide

    # 이미지 base_path: context에서 가져옴
    base_path = ctx_json.get("base_path", "")
    async for event in generate_slide(raw_content, manual_layout=manual_layout, base_path=base_path):
        ev_type = event.get("event", "")
        ev_data = event.get("data", "")
        if ev_type == "progress":
            print(f"  [{ev_type}] {ev_data}")
        elif ev_type == "error":
            print(f"  ❌ {ev_data}")
        elif ev_type == "result":
            print(f"  ✅ 완료 ({len(ev_data)} bytes)")

    # 최신 run 찾기 (YYYYMMDD_HHMMSS 형식만)
    import re as _re
    runs_dir = Path("data/runs")
    dated_runs = [d for d in runs_dir.iterdir() if d.is_dir() and _re.match(r'^\d{8}_\d{6}$', d.name)]
    latest = sorted(dated_runs, reverse=True)[0]
    print(f"\n=== 결과: {latest} ===")

    # 코드 조립도 실행
    from scripts.assemble_stage2 import assemble
    assemble(str(latest))

    print(f"\n확인:")
    print(f"  file:///{latest}/steps/stage_2.html")
    print(f"  file:///{latest}/steps/stage_2_code_assembled.html")
    print(f"  file:///{latest}/steps/stage_3_rendered.html")
    print(f"  file:///{latest}/final.html")


if __name__ == "__main__":
    run_dir = sys.argv[1] if len(sys.argv) > 1 else "data/runs/20260403_133746"
    asyncio.run(main(run_dir))
