"""Run locally: python3 case-reference.py. Reads only the three named CSV files."""
import csv,json
from decimal import Decimal, ROUND_HALF_UP
from collections import defaultdict
from pathlib import Path
BASE=Path(__file__).resolve().parent
def read(name):
    with (BASE/name).open(newline='',encoding='utf-8') as f:return list(csv.DictReader(f))
def money(n):return str((Decimal(n)/100).quantize(Decimal('0.01')))
def main():
    r=read('retail-orders.csv');assert len({x['order_id'] for x in r})==len(r)
    assert all(x['status'] in {'completed','cancelled'} and int(x['net_cents'])>=0 for x in r)
    done=[x for x in r if x['status']=='completed'];monthly=defaultdict(int)
    for x in done:monthly[x['period']]+=int(x['net_cents'])
    inv=read('inventory-counts.csv');assert len({x['sku'] for x in inv})==len(inv)
    differences={x['sku']:int(x['closing_count'])-(int(x['opening'])+int(x['receipts'])-int(x['shipped'])-int(x['damaged'])) for x in inv}
    m=read('campaign-performance.csv');assert len({(x['campaign'],x['period']) for x in m})==len(m)
    spend=sum(int(x['spend_cents']) for x in m);clicks=sum(int(x['clicks']) for x in m);conversions=sum(int(x['conversions']) for x in m)
    return {'retail':{'completed_orders':len(done),'sales_cents':sum(int(x['net_cents']) for x in done),'monthly_cents':dict(monthly)},'inventory':{'differences':differences,'expected_units':sum(int(x['opening'])+int(x['receipts'])-int(x['shipped'])-int(x['damaged']) for x in inv),'counted_units':sum(int(x['closing_count']) for x in inv)},'marketing':{'spend_cents':spend,'clicks':clicks,'conversions':conversions,'rate':conversions/clicks,'cost_per_conversion_eur':str((Decimal(spend)/100/conversions).quantize(Decimal('0.01'),rounding=ROUND_HALF_UP))}}
if __name__=='__main__':print(json.dumps(main(),indent=2))
