"""Per-phrase register use: how widely each song moves its phrase-median pitch across the story."""
import json,sys,numpy as np; from pathlib import Path
S=Path(sys.argv[1]); text={r['id']:r for r in json.load(open(S/'analysis/text-level.json'))}
out={}
for k in ['targ','baseline','new']:
    z=np.load(S/'traces'/f'{k}.npz'); t=z['t']; m=z['midi']; g=z['good']; FR=t[1]-t[0]
    meds=[]; rows=[]
    for p in text[k]['phrasesList']:
        a=int(p['t']/FR); b=int(p['e']/FR); sel=g[a:b]
        if sel.sum()<6: continue
        v=m[a:b][sel]; med=float(np.median(v)); meds.append(med); rows.append({'t':p['t'],'text':p['text'],'median':round(med,1),'p90':round(float(np.percentile(v,90)),1),'min':round(float(v.min()),1)})
    meds=np.array(meds)
    out[k]={'phrasesMeasured':len(meds),'medianOfMedians':round(float(np.median(meds)),1),'sdOfPhraseMedians':round(float(meds.std()),2),'p10':round(float(np.percentile(meds,10)),1),'p90':round(float(np.percentile(meds,90)),1),'spreadP10P90':round(float(np.percentile(meds,90)-np.percentile(meds,10)),1),
      'lowRegisterShare(<58)':round(float((meds<58).mean()),3),'midShare(58-64)':round(float(((meds>=58)&(meds<64)).mean()),3),'highShare(>=64)':round(float((meds>=64).mean()),3),
      'lowestPhrases':sorted(rows,key=lambda r:r['median'])[:8],'highestPhrases':sorted(rows,key=lambda r:-r['median'])[:8]}
json.dump(out,open(S/'analysis/register.json','w'),ensure_ascii=False,indent=1)
for k,v in out.items():
    print(k,{q:v[q] for q in ['phrasesMeasured','medianOfMedians','sdOfPhraseMedians','p10','p90','spreadP10P90','lowRegisterShare(<58)','midShare(58-64)','highShare(>=64)']})
    print('  lowest:',[(r['median'],r['text'][:38]) for r in v['lowestPhrases'][:6]])
    print('  highest:',[(r['median'],r['text'][:38]) for r in v['highestPhrases'][:6]])
