"""Independent raw-row checks plus known-answer event checks."""
import csv,gzip,itertools,json,pathlib,sys
import analyze
ROOT=pathlib.Path(__file__).resolve().parents[1]
DATA=pathlib.Path(sys.argv[1]) if len(sys.argv)>1 else ROOT/'data'
def synthetic(dna_leader,alt_rna,total_rna,weeks=(0,2,4)):
    names=['a','b','c']; idx={x:i for i,x in enumerate(names)}
    d={'samples':names,'index':idx,'normalizer':[1000]*3,'targets':{'PWY-5676':{'total':[100]*3,'A':dna_leader,'B':[20,30,40]}}}
    r={'samples':names,'index':idx,'normalizer':[1000]*3,'targets':{'PWY-5676':{'total':total_rna,'A':[80,40,30],'B':alt_rna}}}
    rows=[{'sample':s,'participant':'synthetic','diagnosis':'CD','week':w,'antibiotics':'No','immunosupp':'No','calprotectin':None} for s,w in zip(names,weeks)]
    return analyze.make_events(rows,d,r,'PWY-5676')[0]
checks=0
x=synthetic([80,30,20],[10,10,20],[100,90,90]);assert len(x)==1 and x[0]['kind']=='decline' and x[0]['signature'];checks+=1
x=synthetic([80,30,20],[10,10,10],[100,90,90]);assert len(x)==1 and not x[0]['signature'];checks+=1
x=synthetic([80,30,20],[10,10,20],[100,90,70]);assert not x[0]['signature'] and x[0]['alternative_increase'];checks+=1
x=synthetic([80,30,50],[10,10,20],[100,90,90]);assert not x;checks+=1
x=synthetic([80,80,80],[10,10,20],[100,90,90]);assert x[0]['kind']=='stable' and x[0]['signature'];checks+=1
x=synthetic([80,30,20],[10,10,20],[100,90,90],weeks=(0,9,10));assert not x;checks+=1
x=synthetic([80,30,20],[0,0,1],[100,90,90]);assert x[0]['signature'];checks+=1
x=synthetic([80,30,20],[0,0,.99],[100,90,90]);assert not x[0]['signature'];checks+=1
x=synthetic([80,30,20],[10,10,12.4],[100,90,90]);assert not x[0]['signature'];checks+=1
x=synthetic([80,30,20],[10,10,12.5],[100,90,80]);assert x[0]['signature'];checks+=1
results=json.loads((ROOT/'results/R1.json').read_text());events=json.loads((ROOT/'results/R2.json').read_text())['primary_event_audit']
with gzip.open(DATA/'MTX3.tsv.gz','rt') as f:
    records=csv.DictReader(f,delimiter='\t');key=records.fieldnames[0]
    raw=[r for r in records if r[key].split(':',1)[0]=='PWY-5676']
    taxa={r[key].partition('|')[2]:r for r in raw if '|' in r[key] and r[key].partition('|')[2]!='unclassified'}
    assert len(taxa)==3
    for ev in events:
        for j,sample in enumerate(ev['samples']):
            alt=sum(float(v[sample+'_pathabundance_cpm']) for taxon,v in taxa.items() if taxon!=ev['leader'])
            assert abs(alt-ev['alternative_rna'][j])<1e-12
    assert all(x==0 for e in events if e['kind']=='decline' for x in e['alternative_rna'])
# Explicit beta(1,n) upper bound for zero successes in one first event per participant.
# Supplemental diagnostic, not an interval for the preregistered participant mean.
n=len({e['participant'] for e in events if e['kind']=='decline'})
upper=1-.05**(1/n)
assert abs((1-upper)**n-.05)<1e-12
out={'synthetic_event_checks':checks,'independent_raw_rna_event_checks':len(events)*3,
     'decline_events_with_zero_alternative_rna_all_visits':sum(e['kind']=='decline' and all(x==0 for x in e['alternative_rna']) for e in events),
     'first_event_participants':n,'illustrative_zero_success_one_sided_95_upper':upper,
     'assumption':'Independent participants, one first qualifying event each and a common response probability; illustrative post hoc bound only. Nonparametric bootstrap degenerates at zero and does not establish zero population risk.'}
(ROOT/'results/R3.json').write_text(json.dumps(out,indent=2,sort_keys=True)+'\n');print(json.dumps(out))
