#!/usr/bin/env python3
"""Dump XFA datasets local names (and template captions when present) from an IMM blank."""
from __future__ import annotations

import json
import sys
import xml.etree.ElementTree as ET
from pathlib import Path

from pypdf import PdfReader

from prefill_imm_xfa_pdf import local_name, _xfa_packets


def dump(pdf_path: str) -> dict:
    reader = PdfReader(pdf_path)
    acro = reader.trailer["/Root"].get("/AcroForm")
    if acro is None:
        return {"error": "no AcroForm", "fields": []}
    xfa = acro.get_object().get("/XFA")
    packets = {name: stream for _, name, stream in _xfa_packets(xfa)}
    out: dict = {"packets": sorted(packets.keys()), "fields": []}
    datasets = packets.get("datasets")
    if datasets is None:
        out["error"] = "no datasets"
        return out
    stream = datasets.get_object() if hasattr(datasets, "get_object") else datasets
    root = ET.fromstring(stream.get_data())
    seen: set[str] = set()
    for el in root.iter():
        name = local_name(el.tag)
        if name.lower() in {"datasets", "data", "xfa:datasets"}:
            continue
        if name in seen:
            continue
        seen.add(name)
        text = (el.text or "").strip()
        out["fields"].append({"xfa": name, "sample": text[:80]})
    return out


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python extract_imm_xfa_fields.py <blank.pdf>")
        raise SystemExit(2)
    print(json.dumps(dump(sys.argv[1]), indent=2, ensure_ascii=False))
