import json

def load(files, sid):
    out={}
    for f in files:
        d=json.load(open(f))
        for s in d['Results']['series']:
            if s['seriesID']!=sid: continue
            for x in s['data']:
                if not x['period'].startswith('M') or x['period']=='M13': continue
                v=x['value'].strip()
                if v in ('-',''): continue
                out[(int(x['year']), int(x['period'][1:]))]=float(v)
    return out

cpi=load(['post_a.json','post_b.json'],'CUSR0000SA0')
ppi=load(['post_a.json','post_b.json'],'WPSFD4')
def rng(d): 
    k=sorted(d); return f'{len(d)} obs, {k[0]} -> {k[-1]}'
print('CPI index:',rng(cpi)); print('PPI index:',rng(ppi))

def mom(d,name):
    ks=sorted(d); r={}
    for i in range(1,len(ks)):
        prev,cur=ks[i-1],ks[i]
        if (prev[0]*12+prev[1])+1 != (cur[0]*12+cur[1]):
            print(f'  [{name}] GAP: no MoM computable for {cur} (prev avail {prev})'); continue
        r[cur]=round((d[cur]-d[prev])/d[prev]*100, 1)
    return r

print('\nGaps:')
cm=mom(cpi,'CPI'); pm=mom(ppi,'PPI')
common=sorted(set(cm)&set(pm))
print(f'\nOverlapping MoM months: {len(common)}  {common[0]} -> {common[-1]}')

joint=[k for k in common if cm[k]<0 and pm[k]<0]
print(f'\n=== JOINT NEGATIVE (both rounded MoM < 0): {len(joint)} of {len(common)} = {len(joint)/len(common)*100:.1f}% ===')
for k in joint: print(f'  {k[0]}-{k[1]:02d}   CPI {cm[k]:+.1f}   PPI {pm[k]:+.1f}')

print(f'\nCPI neg months: {sum(1 for k in common if cm[k]<0)}   PPI neg months: {sum(1 for k in common if pm[k]<0)}')
# independence baseline
pc=sum(1 for k in common if cm[k]<0)/len(common); pp=sum(1 for k in common if pm[k]<0)/len(common)
print(f'If independent, expected joint = {pc*pp*len(common):.1f} months ({pc*pp*100:.1f}%). Actual = {len(joint)}')

strict=[k for k in joint if cm[k]<=-0.2 and pm[k]<=-0.2]
print(f'\n=== STRICT (both <= -0.2, outside rounding noise): {len(strict)} ===')
for k in strict: print(f'  {k[0]}-{k[1]:02d}   CPI {cm[k]:+.1f}   PPI {pm[k]:+.1f}')

print('\nJune 2026 verify: CPI',cm.get((2026,6)),' PPI',pm.get((2026,6)))
for k in [(2026,5),(2026,6)]:
    print(f'  {k}: CPI idx {cpi[k]}  PPI idx {ppi[k]}')
print('  CPI raw pct:', (cpi[(2026,6)]-cpi[(2026,5)])/cpi[(2026,5)]*100)
print('  PPI raw pct:', (ppi[(2026,6)]-ppi[(2026,5)])/ppi[(2026,5)]*100)

# recent 18 months context
print('\nRecent 18 months:')
for k in common[-18:]:
    print(f'  {k[0]}-{k[1]:02d}   CPI {cm[k]:+.1f}   PPI {pm[k]:+.1f}')

json.dump({'cpi_mom':{f'{k[0]}-{k[1]:02d}':v for k,v in cm.items()},
           'ppi_mom':{f'{k[0]}-{k[1]:02d}':v for k,v in pm.items()},
           'cpi_idx':{f'{k[0]}-{k[1]:02d}':v for k,v in cpi.items()},
           'ppi_idx':{f'{k[0]}-{k[1]:02d}':v for k,v in ppi.items()},
           'joint':[f'{k[0]}-{k[1]:02d}' for k in joint]}, open('computed.json','w'), indent=1)
