"""Small fixed-schema example. Reject repeated keys before writing any CSV.
python reject-duplicate-json-keys.py duplicate-keys-clean-sample.json new-output.csv
"""
import csv,json,sys
from pathlib import Path
from decimal import Decimal

def unique_object(pairs):
    result={}
    for key,value in pairs:
        if key in result:
            raise ValueError(f"duplicate object key: {key!r}")
        result[key]=value
    return result

def invalid_constant(value):
    raise ValueError(f"unsupported numeric constant: {value}")

def decode(raw):
    return json.loads(raw,object_pairs_hook=unique_object,
                      parse_float=Decimal,parse_constant=invalid_constant)

def export(source,target):
    rows=decode(Path(source).read_text(encoding='utf-8'))
    columns=['id','amount_original','amount_adjusted']
    if not isinstance(rows,list) or not rows:
        raise ValueError('expected a nonempty array')
    for row in rows:
        if not isinstance(row,dict) or set(row)!=set(columns):
            raise ValueError('exactly id, amount_original and amount_adjusted required')
        if not isinstance(row['id'],str):raise ValueError('id must be text')
        for key in columns[1:]:
            if isinstance(row[key],bool) or not isinstance(row[key],(int,Decimal)):
                raise ValueError('amounts must be numbers')
    with Path(target).open('x',encoding='utf-8',newline='') as file:
        writer=csv.writer(file);writer.writerow(columns)
        writer.writerows([[row[key] for key in columns] for row in rows])
    return {'records':len(rows),'columns':len(columns)}

if __name__=='__main__':print(json.dumps(export(*sys.argv[1:3])))
