"""Preserve every occurrence of item/status JSON records in CSV, Python3.12+.
Adds source_position, a zero-based array position rather than a business ID.
"""
import argparse,csv,json
from pathlib import Path
def unique(pairs):
    d={}
    for k,v in pairs:
        if k in d:raise ValueError('duplicate key: '+repr(k))
        d[k]=v
    return d
def constant(v):raise ValueError('nonstandard constant: '+v)
def load(source):
    with Path(source).open('rb') as f:raw=f.read(1000001)
    if len(raw)>1000000:raise ValueError('input exceeds demo byte policy')
    rows=json.loads(raw.decode('utf-8'),object_pairs_hook=unique,parse_constant=constant)
    if not isinstance(rows,list):raise ValueError('expected array')
    for r in rows:
        if not isinstance(r,dict) or set(r)!={'item','status'}:raise ValueError('expected item/status only')
        for v in r.values():
            if not isinstance(v,str):raise ValueError('string fields required')
            v.encode('utf-8',errors='strict')
    return rows
def convert(source,target):
    rows=load(source)
    with Path(target).open('x',encoding='utf-8',newline='') as f:
        w=csv.writer(f);w.writerow(['source_position','item','status'])
        for i,r in enumerate(rows):w.writerow([str(i),r['item'],r['status']])
    return {'records':len(rows),'source_positions':list(range(len(rows)))}
if __name__=='__main__':
    p=argparse.ArgumentParser(description=__doc__);p.add_argument('source');p.add_argument('target');a=p.parse_args()
    try:print(json.dumps(convert(a.source,a.target)))
    except (ValueError,OSError,RecursionError) as e:p.exit(1,type(e).__name__+': '+str(e)+'\n')
