"""UTF-8 JSON-to-CSV demo: skip one initial signature, keep all field text.
Python 3.12+. Requires an array of objects with exactly id/note string fields.
"""
import argparse,csv,json
from pathlib import Path
MAX_BYTES=1000000
def unique(pairs):
    out={}
    for k,v in pairs:
        if k in out:raise ValueError('duplicate key: '+repr(k))
        out[k]=v
    return out
def constant(value):raise ValueError('nonstandard constant: '+value)
def convert(source,target):
    with Path(source).open('rb') as f:raw=f.read(MAX_BYTES+1)
    if len(raw)>MAX_BYTES:raise ValueError('input exceeds demo byte policy')
    # Decoding skips only an optional signature at byte offset zero.
    text=raw.decode('utf-8-sig',errors='strict')
    rows=json.loads(text,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)!={'id','note'}:raise ValueError('expected id/note only')
        for k in ['id','note']:
            if not isinstance(r[k],str):raise ValueError('string fields required')
            r[k].encode('utf-8',errors='strict')
    with Path(target).open('x',encoding='utf-8',newline='') as f:
        w=csv.writer(f);w.writerow(['id','note']);w.writerows([r['id'],r['note']] for r in rows)
    return {'input_bytes':len(raw),'initial_signature_skipped':raw.startswith(b'\xef\xbb\xbf'),'records':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')
