#!/usr/bin/env python3
"""#25 full E2E 드라이버 — 새 프로젝트 금월도 기획안 + ep1 분석(STAGE 1, 이미지비용 0).
커밋 금지. admin 쿠키 세션. STAGE 2(이미지)는 분석 산출 확인 후 별도 호출.

usage:
  python e2e_geum_driver.py create     # 프로젝트+기획안+ep1 생성, ids 출력→state 파일
  python e2e_geum_driver.py analysis   # run-all category=analysis (blocking, 백그라운드 실행 권장)
  python e2e_geum_driver.py image <cap>  # run-all category=image cap=<cap> approve=true
"""
import sys
import json
import time
from pathlib import Path

import requests

BASE = "http://localhost:8000"
ROOT = Path("/Users/manta/Documents/Projects/TheRoad-I1")
PLANNING_PDF = ROOT / "org" / "금월도_기획안_202603.pdf"
EP1_PDF = ROOT / "org" / "금월도 1부_260226(최종수정본).pdf"
STATE = ROOT / "scratchpad" / "e2e_geum_v16_state.json"

s = requests.Session()


def login():
    r = s.post(f"{BASE}/api/v1/auth/login", json={"username": "admin", "password": "admin123"}, timeout=30)
    r.raise_for_status()
    print("[login] ok", flush=True)


def create():
    login()
    # 1) project
    r = s.post(f"{BASE}/api/v1/projects/", json={"name": "금월도 E2E v16팩검증 20260708", "description": "발명 경계 v16/v10/v2 팩 fresh E2E — 텍스트(analysis)만"}, timeout=60)
    r.raise_for_status()
    pid = r.json()["id"]
    print(f"[project] {pid}", flush=True)
    # 2) planning doc
    with open(PLANNING_PDF, "rb") as f:
        r = s.post(f"{BASE}/api/v1/projects/{pid}/planning-doc", files={"file": (PLANNING_PDF.name, f, "application/pdf")}, timeout=300)
    r.raise_for_status()
    print(f"[planning-doc] ok ({r.status_code})", flush=True)
    # 3) episode 1
    with open(EP1_PDF, "rb") as f:
        r = s.post(
            f"{BASE}/api/v1/projects/{pid}/episodes/",
            data={"episode_number": "1", "title": "금월도 1부"},
            files={"file": (EP1_PDF.name, f, "application/pdf")},
            timeout=300,
        )
    r.raise_for_status()
    eid = r.json()["id"]
    print(f"[episode] {eid}", flush=True)
    STATE.write_text(json.dumps({"project_id": pid, "episode_id": eid}))
    print(f"[state] saved → {STATE}", flush=True)


def _ids():
    d = json.loads(STATE.read_text())
    return d["project_id"], d["episode_id"]


def analysis():
    login()
    pid, eid = _ids()
    t0 = time.time()
    print(f"[analysis] start pid={pid} eid={eid}", flush=True)
    r = s.post(
        f"{BASE}/api/v1/projects/{pid}/episodes/{eid}/steps/run-all",
        params={"mode": "resume", "category": "analysis"},
        timeout=7200,
    )
    print(f"[analysis] status={r.status_code} elapsed={int(time.time()-t0)}s", flush=True)
    try:
        print(json.dumps(r.json(), ensure_ascii=False)[:2000], flush=True)
    except Exception:
        print(r.text[:2000], flush=True)


def run_all(cap):
    login()
    pid, eid = _ids()
    t0 = time.time()
    print(f"[all] start pid={pid} eid={eid} cap={cap}", flush=True)
    r = s.post(
        f"{BASE}/api/v1/projects/{pid}/episodes/{eid}/steps/run-all",
        params={"mode": "resume", "category": "all", "image_call_cap": cap, "approve_image_generation": "true"},
        timeout=21600,
    )
    print(f"[all] status={r.status_code} elapsed={int(time.time()-t0)}s", flush=True)
    try:
        print(json.dumps(r.json(), ensure_ascii=False)[:3000], flush=True)
    except Exception:
        print(r.text[:3000], flush=True)


def image(cap):
    login()
    pid, eid = _ids()
    t0 = time.time()
    print(f"[image] start pid={pid} eid={eid} cap={cap}", flush=True)
    r = s.post(
        f"{BASE}/api/v1/projects/{pid}/episodes/{eid}/steps/run-all",
        params={"mode": "resume", "category": "image", "image_call_cap": cap, "approve_image_generation": "true"},
        timeout=21600,
    )
    print(f"[image] status={r.status_code} elapsed={int(time.time()-t0)}s", flush=True)
    try:
        print(json.dumps(r.json(), ensure_ascii=False)[:3000], flush=True)
    except Exception:
        print(r.text[:3000], flush=True)


if __name__ == "__main__":
    cmd = sys.argv[1] if len(sys.argv) > 1 else "create"
    if cmd == "create":
        create()
    elif cmd == "analysis":
        analysis()
    elif cmd == "all":
        run_all(int(sys.argv[2]))
    elif cmd == "image":
        image(int(sys.argv[2]))
    else:
        print(f"unknown cmd {cmd}")
        sys.exit(1)
