from pathlib import Path
import json,gzip,hashlib
r=Path(__file__).resolve().parents[1]
reports=[]
for db,expected_changes in [('zhct',35),('zhct2',12)]:
 a=r/'private'/('original-'+db);b=r/'private'/('upgraded-'+db)
 am=json.loads((a/'baseline.json').read_text());bm=json.loads((b/'baseline.json').read_text());differences=[];allowed=[0]
 for table,columns in am['metadata'].items():
  indexes=[next(i for i,c in enumerate(bm['metadata'][table])if c['name']==old['name'])for old in columns]
  def hashes(folder,project=False):
   hs=[]
   with gzip.open(folder/(table+'.hex.jsonl.gz'),'rt')as f:
    for line in f:
     row=json.loads(line)
     if project:row=[row[i]for i in indexes]
     elif table=='ydy_dish':
      i=next(i for i,c in enumerate(columns)if c['name']=='composition_name')
      if row[i]is None:row[i]='';allowed[0]+=1
     hs.append(hashlib.sha256(json.dumps(row,separators=(',',':')).encode()).digest())
   return hashlib.sha256(b''.join(sorted(hs))).hexdigest()
  if hashes(a)!=hashes(b,True):differences.append(table)
 assert allowed[0]==expected_changes,(db,allowed)
 report={'database':db,'original_tables':len(am['metadata']),'original_columns':sum(map(len,am['metadata'].values())),'upgraded_tables':len(bm['metadata']),'upgraded_columns':sum(map(len,bm['metadata'].values())),'rows_before':am['rows'],'rows_after':bm['rows'],'allowed_null_to_empty_cells':allowed[0],'unexplained_changed_tables':differences}
 reports.append(report);print(json.dumps(report))
 assert not differences
(r/'evidence/upgrade-preservation.json').write_text(json.dumps(reports,indent=2)+'\n')
