from net import R,dump
import pandas as pd,numpy as np,json
events=pd.read_csv(R/'events.csv');rows=[];months=[];texts=[];end=pd.Timestamp('2026-09-07',tz='UTC')
for e in events.itertuples():
    path=R/'review_windows'/f'{e.appid}.parquet'
    if not path.exists():raise SystemExit('Waiting for complete case windows')
    d=pd.read_parquet(path);d['created']=pd.to_datetime(d.timestamp_created,unit='s',utc=True);event=pd.Timestamp(e.event,tz='UTC')
    anchors=[('first_public_update',event)]
    if e.appid==241600:anchors.append(('stable_release',pd.Timestamp('2018-07-24',tz='UTC')))
    for anchor_name,t in anchors:
        row={'appid':e.appid,'name':e.name,'group':e.group,'anchor':anchor_name,'event':str(t.date()),'gap_years':e.gap_years}
        for days in [30,90,180,365]:
            before=d[d.created.ge(t-pd.Timedelta(days=days))&d.created.lt(t)]
            after=d[d.created.ge(t)&d.created.lt(t+pd.Timedelta(days=days))]
            complete=t+pd.Timedelta(days=days)<=end and t+pd.Timedelta(days=days)<=pd.Timestamp(e.end,tz='UTC')
            row['pre'+str(days)]=len(before);row['post'+str(days)]=len(after) if complete else np.nan;row['change'+str(days)]=len(after)-len(before) if complete else np.nan;row['ratio'+str(days)]=len(after)/len(before) if complete and len(before) else np.nan
        observed_end=min(end,pd.Timestamp(e.end,tz='UTC'),t+pd.Timedelta(days=365))
        post=d[d.created.ge(t)&d.created.lt(observed_end)];row['post_current_positive_pct']=100*post.voted_up.mean() if len(post) else np.nan
        late=post[post.created.ge(t+pd.Timedelta(days=90))];row['observed_days_after90']=max(0,(observed_end-(t+pd.Timedelta(days=90))).days);row['post_after90_count']=len(late)
        row['pre_daily']=row['pre365']/365;row['late_daily']=len(late)/row['observed_days_after90'] if row['observed_days_after90'] else np.nan;row['late_to_pre_rate']=row['late_daily']/row['pre_daily'] if row['pre_daily'] else np.nan
        rows.append(row)
    for k in range(-12,12):
        lo=event+pd.DateOffset(months=k);hi=event+pd.DateOffset(months=k+1)
        if lo<pd.Timestamp(e.start,tz='UTC') or hi>min(end,pd.Timestamp(e.end,tz='UTC')):continue
        x=d[d.created.ge(lo)&d.created.lt(hi)];months.append(dict(appid=e.appid,name=e.name,relative_month=k,count=len(x),start=lo,end=hi))
    # Text screen is for finding interpretable passages, not automatic sentiment
    # attribution. Recommendations/text are current, not archived original votes.
    mask=d.review.str.contains(r'updat|patch|cuz|2\.6|3\.0|2\.3|coming back|came back|return|更新|обнов|actualiz|mise à jour',case=False,regex=True,na=False)
    candidate=d[mask&d.created.ge(event)&d.created.lt(event+pd.Timedelta(days=90))].copy();candidate['event_name']=e.name;texts.append(candidate)
pd.DataFrame(rows).to_csv(R/'event_results.csv',index=False);pd.DataFrame(months).to_csv(R/'event_months.csv',index=False)
pd.concat(texts,ignore_index=True).to_parquet(R/'screened_post_update_reviews.parquet',index=False)
old=pd.read_parquet(R.parent/'career-history-2026-09-06/reviews.parquet');sn=old[old.appid.eq(915310)].copy();sn['created']=pd.to_datetime(sn.timestamp_created,unit='s',utc=True)
baseline=[]
for lo,hi in [('2024-09-01','2025-09-01'),('2025-09-01','2026-09-01')]:
    x=sn[sn.created.ge(lo)&sn.created.lt(hi)];baseline.append(dict(start=lo,end=hi,reviews=len(x),positive=int(x.voted_up.sum()),current_positive_pct=100*x.voted_up.mean()))
pd.DataFrame(baseline).to_csv(R/'snkrx_baseline.csv',index=False)
mentions=sn[sn.created.ge('2022-07-01')&sn.review.str.contains(r'updat|abandon|more content',case=False,regex=True,na=False)].copy();mentions[['recommendationid','created','timestamp_updated','voted_up','language','review']].to_csv(R/'snkrx_update_mentions.csv',index=False)
print(pd.DataFrame(rows)[['name','anchor','pre90','post90','pre365','post365','late_to_pre_rate']].to_string(index=False))
