"""Synthetic GBP event comparison; no client records or accounting judgement."""
import json
from collections import defaultdict
source=[('A',90000),('B',5000),('C',5000)]
destination=[('A',90000),('B',5000),('B',5000)]
def grouped(rows):
 d=defaultdict(list)
 for identity,minor in rows:d[identity].append(minor)
 return d
s=grouped(source);d=grouped(destination);out=[]
for key in sorted(s.keys()|d.keys()):
 left=s[key];right=d[key]
 if not right:status='missing_destination'
 elif not left:status='unexpected_destination'
 elif len(left)!=1 or len(right)!=1:status='multiplicity_review'
 elif left!=right:status='amount_mismatch'
 else:status='matched'
 out.append({'id':key,'sourceCount':len(left),'destinationCount':len(right),'sourceMinor':sum(left),'destinationMinor':sum(right),'status':status})
assert sum(v for _,v in source)==sum(v for _,v in destination)==100000
assert [r['status'] for r in out]==['matched','multiplicity_review','missing_destination']
report={'basis':'Invented one-event-type GBP population at the same declared cut-off; integer minor units','source':source,'destination':destination,'totalMinor':100000,'comparison':out,'grossFeeNetIllustration':{'grossMinor':10000,'feeMinor':300,'netMinor':9700},'scope':'Identity supplied; no fuzzy matching, automatic adjustments or provider report download'}
assert report['grossFeeNetIllustration']['grossMinor']-report['grossFeeNetIllustration']['feeMinor']==report['grossFeeNetIllustration']['netMinor']
if __name__=='__main__':print(json.dumps(report,indent=2))
