# BuildWithThis check script for 'Extract tables from PDFs' (test script v1, frozen 2026-10-16).
# Usage: python pdf-tables-checks.py <results.json> <gnu-time-v file>; needs gt/ from pdf-tables-test-set.zip.
# Check script for extract-tables-from-pdf (frozen v1). Usage: check_tables.py <results.json> <time-v file>
import json, csv, re, sys
R=json.load(open(sys.argv[1])); M=json.load(open('gt/map.json'))
def n(c): return re.sub(r'\s+',' ',str(c)).strip()
GT={k:[[n(c) for c in r] for r in csv.reader(open(f'gt/{k}.csv'))] for k in sum(M.values(),[])}
def acc(gt,ex):
    ex=[[n(c) for c in r] for r in ex]; best=0
    for dr in range(-2,3):
        for dc in range(-2,3):
            hit=0
            for i,row in enumerate(gt):
                for j,c in enumerate(row):
                    ii,jj=i+dr,j+dc
                    if 0<=ii<len(ex) and 0<=jj<len(ex[ii]) and ex[ii][jj]==c: hit+=1
            best=max(best,hit)
    return best/sum(len(r) for r in gt)
res={'tables':{}}; extra=0
for pdf,gts in M.items():
    tabs=R['tables'].get(pdf,[])
    if pdf=='P5' and tabs:  # join all tables from the 2 pages in order, dropping repeated header rows
        hdr=[n(c) for c in tabs[0]['rows'][0]]; rows=list(tabs[0]['rows'])
        for t in tabs[1:]: rows+= [r for r in t['rows'] if [n(c) for c in r]!=hdr]
        tabs=[{'page':1,'rows':rows}]
    used=set()
    for g in gts:
        scores=[(acc(GT[g],t['rows']),i) for i,t in enumerate(tabs) if i not in used]
        a,i=max(scores) if scores else (0,None)
        if i is not None and a>=0.5: used.add(i)
        res['tables'][g]={'accuracy':round(a,4),'found':a>=0.5}
    extra+=len([i for i in range(len(tabs)) if i not in used]) if pdf!='P5' else max(0,len(tabs)-1)
T=res['tables']; dig=[T[k]['accuracy'] for k in ['T1','T2','T3','T4','T5','T6','T7']]
sec=sum(v['s'] for v in R['sec'].values()); pages=sum(v['pages'] for v in R['sec'].values())
kb=int(re.search(r'Maximum resident set size \(kbytes\): (\d+)',open(sys.argv[2]).read()).group(1))
res['X1']={'pass':sum(t['found'] for t in T.values())>=7,'found':sum(t['found'] for t in T.values())}
res['X2']={'pass':sum(dig)/7>=0.9,'avg_digital':round(sum(dig)/7,4)}
res['X3']={'pass':T['T2']['accuracy']>=0.9}; res['X4']={'pass':T['T4']['accuracy']>=0.9}; res['X5']={'pass':T['T5']['accuracy']>=0.9}; res['X6']={'pass':T['T8']['accuracy']>=0.8}
res['X7']={'pass':sec/pages<=10 and kb<=4*1024*1024,'sec_per_page':round(sec/pages,2),'peak_mb':round(kb/1024)}
res['Q3_auto']={'pass':extra<=2,'extra_tables':extra}
res['avg_all8']=round(sum(t['accuracy'] for t in T.values())/8,4)
res['passed']=sum(res[f'X{i}']['pass'] for i in range(1,8))
json.dump(res,open(sys.argv[1].replace('.json','-checks.json'),'w'),indent=1); print(json.dumps(res,indent=1))
