"""Does the Rotation Watch word (BUY TRENCHES / HOLD / STAY OUT) predict trench ACTIVITY and meme PRICES?"""
import json, statistics as S, datetime as dt, collections
import bt_wide as W   # reuses PIT snapshots (snapB) and basket builder
rows=json.load(open('rotdb_daily.json'))
date=[r[0] for r in rows]
import bt_wide as _W
btc=[]
for r in rows:
    d1=(dt.date.fromisoformat(r[0])+dt.timedelta(1)).isoformat()   # CMC snapshot D+1 00:00 = close of D
    btc.append(r[1] or _W.BTC.get(d1))
da=[r[4] for r in rows]; pad=[r[6] for r in rows]
def mean(x,i,n):
    w=[v for v in x[max(0,i-n+1):i+1] if v]; return sum(w)/len(w) if w else None
share=[(100*pad[i]/da[i]) if (pad[i] and da[i]) else None for i in range(len(rows))]
sh7=[mean(share,i,7) for i in range(len(rows))]
words={}
for n in range(40,len(rows)):
    v=n-1
    r7=100*(btc[n]/btc[n-7]-1) if btc[n] and btc[n-7] else None
    lo=min([x for x in sh7[max(0,v-30):v+1] if x] or [0]); hi=max([x for x in sh7[max(0,v-30):v+1] if x] or [0])
    hl=100*(sh7[v]/lo-1) if sh7[v] and lo else None; hh=100*(sh7[v]/hi-1) if sh7[v] and hi else None
    if r7 is None: w=("NO CALL","")
    elif r7<=-10: w=("STAY OUT","btc down")
    elif r7>=10: w=("BUY TRENCHES","btc impulse")
    elif hl is not None and hl>=30: w=("BUY TRENCHES","share heat")
    elif hh is not None and hh<=-30: w=("STAY OUT","share cooling")
    else: w=("HOLD","")
    words[date[n]]=w
# activity outcome: launchpad 7d mean 14 days later vs now (volume read one day back)
didx={d:i for i,d in enumerate(date)}
def pad_fwd(d):
    i=didx[d]-1
    a=mean(pad,i,7); b=mean(pad,i+14,7) if i+14<len(pad) else None
    return (b/a-1) if a and b and i+14<len(pad)-1 else None
# price outcome: equal weight of the meme baskets (point in time, dead coins count)
lines={}
for k,(plat,rule) in list(W.ORIG.items())+[("eth_memes",W.NEW["eth_memes"]),("bnb_memes",W.NEW["bnb_memes"])]:
    ds,L,_=W.build(k,plat,rule); lines[k]=dict(zip(ds,L))
def basket_fwd(d,keys,h=14):
    d1=(dt.date.fromisoformat(d)+dt.timedelta(1)).isoformat(); d2=(dt.date.fromisoformat(d)+dt.timedelta(1+h)).isoformat()
    rs=[lines[k][d2]/lines[k][d1]-1 for k in keys if d1 in lines[k] and d2 in lines[k]]
    return sum(rs)/len(rs) if rs else None
SB=["sol_pump","sol_bonk","sol_memes","base_memes"]
def summ(xs):
    xs=[x for x in xs if x is not None]
    if not xs: return "n=0"
    return f"n={len(xs):3d} mean={S.mean(xs)*100:+6.1f}% med={S.median(xs)*100:+6.1f}% up={sum(x>0 for x in xs)/len(xs)*100:3.0f}%"
out={}
for label,f in (("launchpad volume 14d later",pad_fwd),("Solana+Base meme baskets 14d",lambda d:basket_fwd(d,SB)),("ETH+BNB meme baskets 14d",lambda d:basket_fwd(d,["eth_memes","bnb_memes"])),("Solana+Base meme baskets 30d",lambda d:basket_fwd(d,SB,30))):
    print("==",label)
    for wd in ("BUY TRENCHES","HOLD","STAY OUT"):
        xs=[f(d) for d,w in words.items() if w[0]==wd and d>="2024-04-01"]
        print(f"  {wd:13s} all days     {summ(xs)}")
        for why in ("btc impulse","share heat","btc down","share cooling"):
            ys=[f(d) for d,w in words.items() if w==(wd,why) and d>="2024-04-01"]
            if ys: print(f"    {why:13s}          {summ(ys)}")
    xs=[f(d) for d in words if d>="2024-04-01"]; print(f"  any day       {summ(xs)}")
    # first day of each BUY TRENCHES spell
    prev=None; ev=[]
    for d in sorted(words):
        w=words[d][0]
        if w=="BUY TRENCHES" and prev!="BUY TRENCHES" and d>="2024-04-01": ev.append(f(d))
        prev=w
    print(f"  first day of BUY TRENCHES spells {summ(ev)}")
c=collections.Counter(w[0] for d,w in words.items() if d>="2024-04-01"); print(c)
print("today:",sorted(words.items())[-3:])
json.dump({d:w for d,w in words.items()},open('trench_words.json','w'))
print("--- events")
for why in ("btc impulse","btc down","share heat","share cooling"):
    prev=None; ev=[];evp=[]
    for d in sorted(words):
        w=words[d][1]
        if w==why and prev!=why and d>="2024-04-01":
            ev.append(pad_fwd(d)); evp.append(basket_fwd(d,SB))
        prev=w
    print(why,"launchpad",summ(ev),"| meme prices",summ(evp))
