from common import *
import json
g,t=load();p=g[g.valid&~g.free&~g.explicit&g.year.between(2023,2025)]
rows=[]
for year in [2019,2021,2023,2025]:
    x=g[g.valid&~g.free&~g.explicit&g.year.eq(year)&g.reviews.ge(10)&g.price.notna()]
    rows.append(dict(year=year,n_reviewed10=len(x),median_formula=(x.reviews*x.price*35.9).median(),median_reviews=x.reviews.median()))
save(rows,'reviewed_only_medians.csv')
rows=[]
for tag in ['Idler','FMV','Roguelike Deckbuilder','Action Roguelike','Auto Battler','Horror']:
    a=p[p.appid.isin(member(t,[tag],20))]
    for arm,x in [('all',a),('100plus',a[a.r100])]:
        rows.append(dict(tag=tag,arm=arm,n=len(x),chinese=x.chinese.mean(),russian=x.russian.mean(),japanese=x.japanese.mean(),english=x.english.mean()))
save(rows,'localization_supply.csv')
rows=[]
for minimum in [10,25,100]:
    d=p[p.reviews.ge(minimum)].copy();d['pct_band']=pd.cut(d.pct,[-1,59,69,79,89,94,97,100],labels=['<60','60-69','70-79','80-89','90-94','95-97','98-100'])
    for b,x in d.groupby('pct_band',observed=True):rows.append(dict(min_reviews=minimum,pct_band=b,**stats(x)))
save(rows,'current_positivity.csv')
# Deliberately named successes verify their existence and response, not prevalence.
ns=["Nubby's Number Factory",'CloverPit','Slots & Daggers','BALL x PIT','Scritchy Scratchy','RACCOIN: Coin Pusher Roguelike','Gamble With Your Friends','R.E.P.O.','PEAK','RV There Yet?','Megabonk']
a=g[g.name.isin(ns)&g.valid][['appid','name','date','reviews','pct','price']];a.to_csv(R/'named_breakout_cases.csv',index=False)
assert len(a)==len(ns),(a['name'].tolist(),ns)
s=R.parent/'career-history-2026-09-06';rr=pd.read_parquet(s/'reviews.parquet');targets=pd.read_parquet(s/'targets.parquet');rr=rr[rr.appid.isin(targets.loc[targets.is_free.eq(0),'appid'])].copy()
rr['day90']=rr.appid.map(g.set_index('appid').date.map(lambda x:x.timestamp() if pd.notna(x) else float('nan')))+90*86400
meta={'primary_review_records':len(rr),'first90':int(rr.timestamp_created.lt(rr.day90).sum()),'first90_updated_after90':int((rr.timestamp_created.lt(rr.day90)&rr.timestamp_updated.ge(rr.day90)).sum()),'note':'Update timestamps do not prove recommendation changes; they establish current records are not frozen original reviews.'}
h=pd.read_csv(R/'history_windows.csv');meta['median_launch_month_days']=h.launch_month_days.median();meta['median_calendar_month_to_day30']=h.month_to_day30_ratio.median()
(R/'history_method_audit.json').write_text(json.dumps(meta,indent=2));print(meta)
