import argparse
import hashlib
import json
import math
from pathlib import Path

import pymupdf


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("pdf", type=Path)
    parser.add_argument("--output", type=Path, required=True)
    parser.add_argument("--dpi", type=int, default=144)
    args = parser.parse_args()
    if not 72 <= args.dpi <= 300:
        raise ValueError("Local example DPI must be between 72 and 300")
    if args.pdf.stat().st_size > 50 * 1024 * 1024:
        raise ValueError("Local example PDF limit: 50 MiB")
    if args.output.exists():
        raise ValueError("Choose a new output directory")
    with pymupdf.open(args.pdf) as document:
        if not document.is_pdf or document.needs_pass:
            raise ValueError("Use an unencrypted PDF")
        if not 1 <= len(document) <= 20:
            raise ValueError("Local example limit: one to twenty pages")
        for page in document:
            width = math.ceil(page.rect.width * args.dpi / 72)
            height = math.ceil(page.rect.height * args.dpi / 72)
            if width * height > 16_000_000:
                raise ValueError(f"Page {page.number + 1} exceeds the local 16-million-pixel limit")
        args.output.mkdir(parents=True)
        pages = []
        for page in document:
            page_id = f"page_{page.number + 1:03d}"
            path = args.output / f"{page_id}.png"
            pixmap = page.get_pixmap(dpi=args.dpi, colorspace=pymupdf.csRGB, alpha=False)
            pixmap.save(path)
            pages.append({"page_id": page_id, "source_page": page.number + 1, "filename": path.name, "width": pixmap.width, "height": pixmap.height, "sha256": hashlib.sha256(path.read_bytes()).hexdigest(), "text_layer_characters": len(page.get_text().strip())})
        (args.output / "manifest.json").write_text(json.dumps({"source_sha256": hashlib.sha256(args.pdf.read_bytes()).hexdigest(), "dpi": args.dpi, "pages": pages, "network_requests": 0}, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
        print(json.dumps({"pages": len(pages), "network_requests": 0, "output": str(args.output)}, ensure_ascii=False))


if __name__ == "__main__":
    main()
