"""Numeric-fidelity comparison: per (doc, page), the richest single table's
numeric-cell count in the baseline vs the current version. Financial tables
are numbers; prose mis-detected as a table carries almost none. This
isolates whether any real financial data regressed, ignoring prose-noise
churn.

Working directory: $REVIEW_DIR, or argv[1], default .camelot-eval.
"""

import glob
import json
import os
import re
import sys
from collections import defaultdict

EVAL = sys.argv[1] if len(sys.argv) > 1 else os.environ.get("REVIEW_DIR", ".camelot-eval")
NUM = re.compile(r"\d")


def numeric_cells(t):
    return sum(1 for r in t["cells"] for c in r if NUM.search(str(c)))


def page_best(doc):
    """Per page: max numeric-cell count over that page's tables."""
    best = defaultdict(int)
    for t in doc["tables"]:
        best[t["page"]] = max(best[t["page"]], numeric_cells(t))
    return best


def main():
    names = sorted(os.path.basename(p)[3:-5] for p in glob.glob(os.path.join(EVAL, "v2_*.json")))
    regressions = []
    tot1 = tot2 = 0
    for name in names:
        v1 = json.load(open(os.path.join(EVAL, f"v1_{name}.json")))
        v2 = json.load(open(os.path.join(EVAL, f"v2_{name}.json")))
        b1, b2 = page_best(v1), page_best(v2)
        d1 = sum(b1.values())
        d2 = sum(b2.values())
        tot1 += d1
        tot2 += d2
        page_reg = []
        for pg in sorted(set(b1) | set(b2)):
            # real regression: current has fewer numeric cells AND the baseline
            # had a meaningfully numeric table (>=8 numeric cells) on that page
            if b2[pg] < b1[pg] and b1[pg] >= 8:
                page_reg.append(f"  p{pg}: numeric cells {b1[pg]} -> {b2[pg]}")
        verdict = "OK" if not page_reg else f"NUMERIC REGRESSION ({len(page_reg)})"
        print(f"{name[:48]:<50} numeric: v1={d1:>5} v2={d2:>5}  {verdict}")
        if page_reg:
            regressions.append((name, page_reg))

    print("-" * 80)
    print(f"{'TOTAL numeric cells':<50} v1={tot1:>5} v2={tot2:>5}")
    print()
    if regressions:
        print(f"REAL NUMERIC REGRESSIONS in {len(regressions)} doc(s):")
        for name, rows in regressions:
            print(f"\n{name}")
            for r in rows:
                print(r)
    else:
        print("NO NUMERIC REGRESSIONS: current version preserves >= baseline financial data on every page.")


if __name__ == "__main__":
    main()
