"""org/ 의 시나리오 전부를 프로덕션과 **같은 경로**로 정리해 파일로 남긴다.

씬 분해 규칙은 `text_cleanup` 정리본에서 저작하고 정리본에 실행해야 한다.
PDF 화면·PDF 직접 추출·정리본은 서로 다른 텍스트라, 한 표현에서 저작해 다른
표현에 실행하면 규칙이 맞아도 실패한다. 그런데 저장소에 정리본이 있는 대본은
넷뿐이고 형식 3종만 덮는다 — 나머지를 실측하려면 정리를 실제로 태워야 한다.

★**DB 도 프로젝트도 만들지 않는다.** `extract_text_from_pdf_llm` 만 직접 불러
결과를 파일로 남긴다. 도는 재실행에 아무것도 안 닿는다.

★**이어받는다.** 산출 파일이 있으면 건너뛴다. 25회 안팎의 provider 호출이라
중간에 끊겨도 처음부터 다시 하지 않는다.

사용: cd backend && .venv/bin/python build_cleaned_corpus.py
"""
from __future__ import annotations

import sys
import time
import traceback
from datetime import datetime
from pathlib import Path

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

ROOT = Path(__file__).resolve().parent.parent
ORG = ROOT / "org"
OUT = ROOT / "artifact" / "20260808_세그먼테이션_저작" / "cleaned"


def log(msg: str) -> None:
    print(f"{datetime.now().strftime('%H:%M:%S')} {msg}", flush=True)


def main() -> None:
    from app.modules.pipeline.text_cleaner import extract_text_from_pdf_llm

    OUT.mkdir(parents=True, exist_ok=True)
    pdfs = sorted(ORG.glob("*.pdf"))
    log(f"대본 {len(pdfs)}개 · 산출 {OUT}")

    done = failed = skipped = 0
    for i, pdf in enumerate(pdfs, start=1):
        target = OUT / f"{pdf.stem}.txt"
        if target.exists() and target.stat().st_size > 0:
            skipped += 1
            log(f"[{i}/{len(pdfs)}] 건너뜀(이미 있음) {pdf.name[:44]}")
            continue
        started = time.monotonic()
        try:
            cleaned = extract_text_from_pdf_llm(
                pdf_path=str(pdf),
                opik_metadata={"step": "segment_corpus", "source": pdf.name},
            )
        except Exception as exc:  # noqa: BLE001 — 한 대본이 막아도 나머지는 간다
            failed += 1
            log(f"[{i}/{len(pdfs)}] ✗ {pdf.name[:44]} — {type(exc).__name__}: {exc}")
            (OUT / f"{pdf.stem}.error.txt").write_text(
                traceback.format_exc(), encoding="utf-8")
            continue
        target.write_text(cleaned or "", encoding="utf-8")
        done += 1
        log(f"[{i}/{len(pdfs)}] ✓ {pdf.name[:44]} — {len(cleaned or ''):,}자 "
            f"({time.monotonic() - started:.0f}s)")

    log(f"끝 — 새로 만든 것 {done} · 건너뜀 {skipped} · 실패 {failed}")


if __name__ == "__main__":
    main()
