"""Demonstration: explicit id/text string schema; no inference or overwrite."""
import argparse, csv, io, json
from pathlib import Path
FIELDS=['id','text']
def unique(pairs):
    result={}
    for key,value in pairs:
        if key in result: raise ValueError('duplicate JSON key')
        result[key]=value
    return result
def constant(value): raise ValueError('nonstandard JSON constant')
def export(source,target):
    with Path(source).open('rb') as f: raw=f.read(1000001)
    if len(raw)>1000000: raise ValueError('demo input exceeds 1000000 bytes')
    rows=json.loads(raw.decode('utf-8'),object_pairs_hook=unique,parse_constant=constant)
    if not isinstance(rows,list): raise ValueError('top-level array required')
    matrix=[]
    for row in rows:
        if not isinstance(row,dict) or set(row)!=set(FIELDS): raise ValueError('exact id/text schema required')
        if not all(isinstance(row[k],str) for k in FIELDS): raise ValueError('string fields required')
        values=[row[k] for k in FIELDS]
        for value in values: value.encode('utf-8',errors='strict')
        matrix.append(values)
    stream=io.StringIO(newline=''); writer=csv.writer(stream)
    writer.writerow(FIELDS); writer.writerows(matrix)
    with Path(target).open('x',encoding='utf-8',newline='') as f: f.write(stream.getvalue())
    with Path(target).open(encoding='utf-8',newline='') as f: recovered=list(csv.reader(f,strict=True))
    if recovered != [FIELDS]+matrix: raise ValueError('read-back differs')
    print(json.dumps({'data_records':len(matrix),'columns':len(FIELDS),'exact_readback':True}))
if __name__=='__main__':
    p=argparse.ArgumentParser(); p.add_argument('source'); p.add_argument('target'); a=p.parse_args()
    try: export(a.source,a.target)
    except (ValueError,OSError,csv.Error) as e: p.exit(1,type(e).__name__+': '+str(e)+'\n')
