#!/usr/bin/env python3
"""Reproduce the fixed directory CSV or summary. No network, installs or writes.
Usage: python3 reproduce-minnesota-directory-summary-2026-10-29-reliability.py JSON_PATH [--records]
Default: summary CSV. --records: one public creator entity per CSV row.
"""
from pathlib import Path
from collections import Counter
import argparse,csv,hashlib,json,sys
BASE='https://joshliljenquist.com';DATE='2026-10-29';EDIR='data/minnesota-editions/reference-2026-10-29-reliability'
def flat_rows(records,digest):
 return [{'entity_id':r['entity_id'],'public_name':r['display_name'],'entity_type':r['entity_type'],'category':r['category'],'known_for':r['known_for'],'public_geography':r['location_general'],'geography_class':r['geographic_scope'],'qualification':r['qualification_type'],'recorded_platform_labels':' | '.join(r['primary_platforms']),'official_website':r['official_website']or'','official_profile_urls':' | '.join(r['official_profiles']),'geography_source_url':r['geography_source_url'],'source_class':r['geography_source_class'],'source_publication_date':r.get('geography_source_date')or'UNKNOWN_UNDATED','geography_review_date':r['geography_verified_date'],'source_limitation':r.get('geography_source_note')or r.get('geography_review_limitation')or'Individual source scope applies; no private residence inference.','fixed_source_url':BASE+'/'+EDIR+'/minnesota-creators-2026.json','source_sha256':digest}for r in records]

def summary_rows(records,digest):
 rows=[];n=len(records)
 def add(dim,value,count,rule):rows.append({'dimension':dim,'value':value,'records':count,'directory_denominator':n,'counting_rule':rule,'source_snapshot':DATE,'targeted_geography_review':'Mixed record dates; three additions checked 2026-10-29','fixed_source_url':BASE+'/'+EDIR+'/minnesota-creators-2026.json','source_sha256':digest})
 for dim,c,rule in [('geography',Counter(r['geographic_scope']for r in records),'Exclusive public geography classes; unresolved locality is not Greater Minnesota.'),('platform_label',Counter(p for r in records for p in r['primary_platforms']),'Overlapping discovery labels, not verified audience-ranking accounts or unique people.'),('category',Counter(r['category'].casefold()for r in records),'Original labels casefolded only.'),('entity_type',Counter(r['entity_type']for r in records),'One creator entity; a group counts once.')]:
  for k,v in sorted(c.items()):add(dim,k,v,rule)
 for geo in sorted({r['geographic_scope']for r in records}):
  for platform in ['Instagram','YouTube','Facebook','TikTok']:add('geography_platform_label',geo+'|'+platform,sum(r['geographic_scope']==geo and platform in r['primary_platforms']for r in records),'Intersection of public geography and recorded platform; columns overlap.')
 for name,required in [('instagram_and_youtube',{'Instagram','YouTube'}),('all_four_social_platforms',{'Instagram','YouTube','Facebook','TikTok'})]:add('platform_overlap',name,sum(required<=set(r['primary_platforms'])for r in records),'Set inclusion in metadata, not active accounts, unique audiences or statewide adoption.')
 return rows
if __name__=='__main__':
 p=argparse.ArgumentParser();p.add_argument('input',type=Path);p.add_argument('--records',action='store_true');a=p.parse_args()
 try:
  raw=a.input.read_bytes();digest=hashlib.sha256(raw).hexdigest()
  if digest!='668b4bfbe392047a59621c573dda9bb75f1b5025a003fd5c94986840fad49e88':raise ValueError('Wrong or altered fixed directory edition')
  data=json.loads(raw);rows=flat_rows(data['records'],digest)if a.records else summary_rows(data['records'],digest);w=csv.DictWriter(sys.stdout,fieldnames=list(rows[0]),lineterminator='\n');w.writeheader();w.writerows(rows)
 except(OSError,ValueError,KeyError)as e:raise SystemExit('Cannot reproduce: '+str(e))
