#!/usr/bin/env python3
"""시나리오 원고 → PDF, 그리고 **되읽어 줄 단위 대조** (2026-08-29 재작성).

업로드는 PDF 만 받는다(txt 경로 없음). 그래서 PDF 가 원고를 **글자 그대로**
담았는지 확인해야 한다 — 안 그러면 파이프라인이 내 원고가 아닌 것을 읽는다.
★만들고 끝내지 않는다. 프로덕션 추출기로 되읽어 원문과 대조하고, 어긋나면
 **멈춘다**.

usage: make_scenario_pdf.py <원고.txt>
"""
from __future__ import annotations

import pathlib
import sys

HERE = pathlib.Path(__file__).resolve()
sys.path.insert(0, str(HERE.parents[1] / "backend"))

#: ★AppleGothic.ttf 는 `OS/2` 표가 없어 fpdf 가 거부한다. .ttc 에서
#  OS/2 를 가진 것을 뽑아 쓴다(빌더가 없으면 여기서 만든다).
FONTS = [str(HERE.parent / "_ko_font.ttf")]


def main() -> int:
    src = pathlib.Path(sys.argv[1])
    out = src.with_suffix(".pdf")
    text = src.read_text()
    font = next((f for f in FONTS if pathlib.Path(f).is_file()), None)
    if not font:
        raise SystemExit("★한글 폰트를 못 찾았다 — 깨진 PDF 를 만들지 않는다")

    from fpdf import FPDF
    pdf = FPDF(format="A4")
    pdf.add_font("KO", "", font)
    pdf.set_margins(18, 18, 18)
    pdf.set_auto_page_break(auto=True, margin=18)
    pdf.add_page()
    pdf.set_font("KO", size=11)
    w = pdf.w - pdf.l_margin - pdf.r_margin      # ★폭을 명시한다 (0 은 안 먹음)
    for line in text.splitlines():
        pdf.multi_cell(w, 6.2, line if line.strip() else " ")
    pdf.output(str(out))
    print(f"만듦: {out} ({out.stat().st_size:,} bytes) · 폰트 {pathlib.Path(font).name}")

    # ★되읽어 대조 — 프로덕션이 쓰는 추출기로
    try:
        import pdfplumber
        with pdfplumber.open(out) as f:
            back = "\n".join((p.extract_text() or "") for p in f.pages)
        lib = "pdfplumber"
    except ImportError:
        from pypdf import PdfReader
        back = "\n".join((p.extract_text() or "") for p in PdfReader(out).pages)
        lib = "pypdf"
    # ★2바이트 CID 를 pypdf 가 널 끼워 읽는다 — 그것을 「깨졌다」로 읽으면
    #  멀쩡한 PDF 를 버린다(2026-08-29 실측: 널만 빼면 40/40 일치).
    back = back.replace("\x00", "")
    norm = lambda s: [x.strip() for x in s.splitlines() if x.strip()]
    a, b = norm(text), norm(back)
    print(f"\n═══ 되읽어 대조 ({lib}) ═══")
    print(f"  원문 {len(a)}줄 · 추출 {len(b)}줄")
    miss = [x for x in a if x not in b]
    if miss:
        print(f"  ★추출본에 없는 줄 {len(miss)}개 — **멈춘다**")
        for m in miss[:5]:
            print(f"     {m[:70]}")
        return 1
    print(f"  ✓ 원문 {len(a)}줄이 전부 추출본에 있다")
    heads = [x for x in b if x.startswith("#")]
    print(f"  ✓ 씬 헤딩 {len(heads)}개: {heads}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
