"""Offline use of scored-language subsets already returned before collection stopped."""
from pathlib import Path
import pandas as pd,numpy as np,json,math
R=Path(__file__).resolve().parent;d=pd.read_parquet(R/'observations.parquet');rows=[];recons=[];comparisons=[];majorities=[]
for game in d.itertuples():
    raw=json.loads((R/'store_summaries'/f'{game.appid}.json').read_text())
    subsets=raw.get('props',{}).get('filter_options',{}).get('rgLanguageOutliers',[])
    if not subsets:continue
    langs={x['strLanguage']:{'count':x['nReviews'],'positive':x['nReviewsPositive']} for x in subsets}
    if 'english' in langs:assert langs['english']['count']==game.english_count
    langs['english']={'count':game.english_count,'positive':game.english_positive}
    total=game.total;pos=game.positive;residual=total-sum(x['count'] for x in langs.values());rp=pos-sum(x['positive'] for x in langs.values())
    recons.append(dict(appid=game.appid,name=game.name,total=total,measured_count=total-residual,residual_count=residual,residual_positive=rp,residual_share=residual/total))
    assert residual>=0 and 0<=rp<=residual,(game.appid,residual,rp)
    for lang,x in langs.items():
        rows.append(dict(appid=game.appid,name=game.name,language=lang,count=x['count'],positive=x['positive'],share=x['count']/total,positive_pct=100*x['positive']/x['count'] if x['count'] else None))
        if lang!='english' and x['count']>=50 and game.english_count>=50:
            p1=game.english_positive/game.english_count;p2=x['positive']/x['count'];delta=100*(p1-p2);se=100*math.sqrt(p1*(1-p1)/game.english_count+p2*(1-p2)/x['count'])
            comparisons.append(dict(appid=game.appid,name=game.name,language=lang,english_count=game.english_count,other_count=x['count'],english_pct=100*p1,other_pct=100*p2,english_minus_other_pp=delta,lo95=delta-1.96*se,hi95=delta+1.96*se))
    rows.append(dict(appid=game.appid,name=game.name,language='unreported_languages',count=residual,positive=rp,share=residual/total,positive_pct=100*rp/residual if residual else None))
    non={k:v for k,v in langs.items() if k!='english'}
    if non:
        lang=max(non,key=lambda k:non[k]['count']);count=non[lang]['count']
        majorities.append(dict(appid=game.appid,largest_reported_language=lang,count=count,share=count/total,confirmed_majority=count>total/2))
p=pd.DataFrame(rows);p.to_csv(R/'available_language_profiles.csv',index=False);pd.DataFrame(recons).to_csv(R/'available_profile_reconciliation.csv',index=False);pd.DataFrame(comparisons).to_csv(R/'available_language_reception.csv',index=False)
maj=pd.DataFrame(majorities);annotated=d.merge(maj,on='appid',how='left')
annotated['language_status']=np.where(annotated.confirmed_majority.eq(True),'confirmed majority from returned counts','not established by available summaries')
annotated.drop(columns=['desc']).to_csv(R/'annotated_observations.csv',index=False)
annotated[annotated.low_english_10].sort_values('nonenglish_count',ascending=False).drop(columns=['desc']).to_csv(R/'annotated_discoveries.csv',index=False)
summary={'games_with_reported_language_subsets':len(recons),'named_language_comparisons':len(comparisons),'low_english10_with_confirmed_majority':int((annotated.low_english_10&annotated.confirmed_majority.eq(True)).sum()),'all_low_english10':int(annotated.low_english_10.sum()),'note':'Scored-language subsets favor larger games and languages. Unreported languages retained as an explicit remainder; missing languages are not zero.'}
(R/'available_profile_summary.json').write_text(json.dumps(summary,indent=2));print(json.dumps(summary,indent=2))
