#!/usr/bin/env python3
"""
MCRO filename / doc_sha256 dump
===============================

Scan a directory of MCRO JSON files and emit a single CSV containing:

  - filename    (data["filename"] from the JSON)
  - doc_sha256  (data["doc_sha256"] or, if missing, data["sha256"])

This is a diagnostic script to verify how filenames and hashes are stored
inside each JSON document.

Usage:
  python3 mcro_filename_sha_dump.py \
      --input /path/to/json_dir \
      --out filename_sha_dump.csv \
      [--pattern "*.json"] \
      [--recurse]
"""

import argparse
import csv
import json
from pathlib import Path
import sys


def main():
    ap = argparse.ArgumentParser(description="Dump filename and doc_sha256 from MCRO JSON files.")
    ap.add_argument("--input", required=True, help="Directory containing JSON files")
    ap.add_argument("--out", required=True, help="Output CSV file path")
    ap.add_argument("--pattern", default="*.json", help='Glob for JSON files (default: "*.json")')
    ap.add_argument("--recurse", action="store_true", help="Recurse into subdirectories")
    args = ap.parse_args()

    json_dir = Path(args.input)
    if not json_dir.is_dir():
        print(f"[error] Input directory does not exist or is not a directory: {json_dir}", file=sys.stderr)
        sys.exit(1)

    if args.recurse:
        files = sorted(json_dir.rglob(args.pattern))
    else:
        files = sorted(json_dir.glob(args.pattern))

    if not files:
        print(f"[warn] No JSON files matched {args.pattern} under {json_dir}", file=sys.stderr)
        sys.exit(0)

    rows = []

    for jp in files:
        try:
            data = json.loads(jp.read_text(encoding="utf-8"))
        except Exception as e:
            print(f"[warn] Skipping {jp}: failed to parse JSON ({e})", file=sys.stderr)
            continue

        if not isinstance(data, dict):
            print(f"[warn] Skipping {jp}: JSON root is not an object", file=sys.stderr)
            continue

        filename = data.get("filename", "")
        doc_sha256 = data.get("doc_sha256") or data.get("sha256") or ""

        rows.append({
            "filename": filename,
            "doc_sha256": doc_sha256,
        })

    out_path = Path(args.out)
    out_path.parent.mkdir(parents=True, exist_ok=True)

    with out_path.open("w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=["filename", "doc_sha256"])
        writer.writeheader()
        writer.writerows(rows)

    print(f"[ok] Wrote {len(rows)} rows to: {out_path.resolve()}")


if __name__ == "__main__":
    main()
