"""Per-page visual verification of the anatomy approach on any PDF.

For documents without numeric ground truth (Visa, TMUS, web PDFs), the
deliverable is per-page rendered evidence: run the anatomy locator on every
page and overlay its regions so each page can be checked by eye for the
three failure modes — slicing, merging, prose false-positives — and for
full-anatomy capture (title/headers/labels/footers). Prints the per-page
table count and writes one contact sheet per document.
"""

from __future__ import annotations

import argparse
import asyncio
import tempfile
from pathlib import Path

import fitz
from PIL import Image

from experiments.que245.approaches import make_locator
from experiments.que245.overlay import draw_boxes, render_page

RENDER = Path("experiments/que245/render")


async def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("pdf")
    ap.add_argument("--pages", default=None, help="e.g. 1-5; default all")
    ap.add_argument("--rows", type=int, default=24)
    ap.add_argument("--cols", type=int, default=12)
    ap.add_argument("--model", default="claude-haiku-4-5-20251001")
    ap.add_argument("--temp", default="0.0")
    ap.add_argument("--approach", default="anatomy-snap")
    ap.add_argument("--per-row", type=int, default=4)
    args = ap.parse_args()

    pdf = Path(args.pdf)
    doc = fitz.open(str(pdf))
    if args.pages:
        a, b = args.pages.split("-")
        pages = list(range(int(a), int(b) + 1))
    else:
        pages = list(range(1, doc.page_count + 1))
    temp = None if args.temp == "none" else float(args.temp)

    loc = make_locator(args.approach, model=args.model, temperature=temp, rows=args.rows, cols=args.cols)
    imgs = []
    print(f"{pdf.name}  rows={args.rows} cols={args.cols} model={args.model}")
    for p in pages:
        with tempfile.TemporaryDirectory() as tmp:
            ip = Path(tmp) / "p.png"
            doc[p - 1].get_pixmap(dpi=200).save(str(ip))
            located = await loc.locate(ip, pdf, p)
        print(f"  page {p:>2}: {len(located)} tables  " +
              "; ".join(f"{t.title[:30]!r}" for t in located))
        im = render_page(pdf, p, dpi=110)
        im = draw_boxes(im, [("T", [t.region for t in located], (0, 80, 230))])
        imgs.append(im)

    w = max(i.width for i in imgs)
    h = max(i.height for i in imgs)
    per = args.per_row
    rows_n = (len(imgs) + per - 1) // per
    sheet = Image.new("RGB", (w * per, h * rows_n), (255, 255, 255))
    for i, im in enumerate(imgs):
        sheet.paste(im, ((i % per) * w, (i // per) * h))
    out = RENDER / f"e2e_{pdf.stem[:20]}_{args.approach}_r{args.rows}.png"
    sheet.save(out)
    print(f"saved {out}  ({sheet.size})")


if __name__ == "__main__":
    asyncio.run(main())
