"""Preserve label strings; require id/label string records. No normalization.
python unicode-to-csv.py unicode-input.json new-output.csv
"""
import csv,json,sys
from pathlib import Path
def unique(pairs):
    result={}
    for k,v in pairs:
        if k in result:raise ValueError('duplicate key: '+repr(k))
        result[k]=v
    return result
def constant(v):raise ValueError('nonstandard JSON constant: '+v)
raw=Path(sys.argv[1]).read_bytes()
if len(raw)>2000000:raise ValueError('recipe input cap: 2000000 bytes')
rows=json.loads(raw.decode('utf-8'),object_pairs_hook=unique,parse_constant=constant)
if not isinstance(rows,list):raise ValueError('expected array')
for row in rows:
    if not isinstance(row,dict) or set(row)!={'id','label'}:raise ValueError('expected id/label only')
    if not all(isinstance(row[k],str) for k in ('id','label')):raise ValueError('string fields required')
    for value in row.values():value.encode('utf-8',errors='strict')
with Path(sys.argv[2]).open('x',encoding='utf-8',newline='') as f:
    w=csv.writer(f);w.writerow(['id','label'])
    w.writerows([r['id'],r['label']] for r in rows)
