from pathlib import Path
import pandas as pd,numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
R=Path(__file__).resolve().parent;d=pd.read_parquet(R/'observations.parquet');assert len(d)==456
plt.rcParams.update({'font.family':['DejaVu Sans','Noto Sans CJK TC'],'font.size':11,'axes.spines.top':False,'axes.spines.right':False})
fig,ax=plt.subplots(1,2,figsize=(14,6.5),gridspec_kw={'width_ratios':[1.1,1]})
for supported,color,label in [(True,'#276c84','English support listed'),(False,'#d08c42','English support not listed')]:
    a=d[d.english_support.eq(supported)];ax[0].scatter(a.total,a.english_count+1,c=color,s=24,alpha=.65,label=label,edgecolors='none')
x=np.geomspace(100,max(d.total)*1.15,200);ax[0].plot(x,.1*x+1,'--',color='#777',lw=1,label='10% English share')
ax[0].axhline(100,color='#aaa',lw=.8);ax[0].set_xscale('log');ax[0].set_yscale('log');ax[0].set_xlabel('All-language Steam-purchase reviews');ax[0].set_ylabel('English-marked reviews + 1 (zero retained)');ax[0].legend(loc='upper left',fontsize=9,frameon=False)
ax[0].set_title('Low English share and low English count differ',loc='left',fontsize=12,fontweight='bold',pad=12)
w=pd.read_csv(R/'weighted_estimates.csv');w=w[w.domain.eq('all')].set_index('metric')
keys=['majority_nonenglish','low_english_25','low_english_10','substantial_elsewhere_low_english'];labs=['More than half non-English','At most 25% English','At most 10% English','500+ non-English, <100 English,\nand at most 10% English']
a=w.loc[keys];y=np.arange(len(a));vals=a.estimate.to_numpy()*100;lo=(a.estimate-a.lo95).to_numpy()*100;hi=(a.hi95-a.estimate).to_numpy()*100
ax[1].barh(y,vals,color='#276c84',height=.6,xerr=np.array([lo,hi]),capsize=3,error_kw={'lw':1})
for i,row in enumerate(a.itertuples()):ax[1].text(row.hi95*100+1,i,f'{row.estimate*100:.1f}%',va='center',fontsize=10)
ax[1].set_yticks(y,labs);ax[1].invert_yaxis();ax[1].set_xlim(0,max(a.hi95)*100+13);ax[1].set_xlabel('Estimated share of eligible games (%)')
ax[1].set_title('Weighted estimates from the random sample',loc='left',fontsize=12,fontweight='bold',pad=12)
fig.suptitle('Steam beyond English-language review attention',x=.04,ha='left',fontsize=17,fontweight='bold')
fig.text(.04,.018,'456 stratified random games represent 13,536 paid games outside explicit descriptors, released 2019–Aug 2026 with 100+ snapshot reviews.\nIntervals reflect sampling uncertainty only. Review language is not nationality, sales, or awareness outside Steam.',fontsize=9,color='#555')
fig.tight_layout(rect=[0,.085,1,.91],w_pad=2.5);fig.savefig(R/'language_attention.png',dpi=170);fig.savefig(R/'language_attention.svg');plt.close(fig)
if (R/'language_profiles.csv').exists():
    p=pd.read_csv(R/'language_profiles.csv');chosen=pd.read_parquet(R/'profile_sample.parquet');order=chosen.sort_values(['share_bin','english_share']).appid.tolist()
    langorder=['english','schinese','tchinese','russian','japanese','koreana','brazilian','spanish','latam','german','french','other_unmeasured']
    labels=['English','Simplified Chinese','Traditional Chinese','Russian','Japanese','Korean','Brazilian Portuguese','European Spanish','Latin American Spanish','German','French','Other languages']
    colors=['#336b87','#b54343','#d97968','#ca9c36','#9364a2','#cb88b2','#398369','#64ac8f','#91c8a9','#829daa','#aec0c8','#d9d9d9']
    a=p[p.language.ne('all')].pivot(index='appid',columns='language',values='share').reindex(index=order,columns=langorder).fillna(0)
    fig,ax=plt.subplots(figsize=(14,max(8,len(a)*.27)));left=np.zeros(len(a))
    for lang,label,color in zip(langorder,labels,colors):v=a[lang].to_numpy()*100;ax.barh(np.arange(len(a)),v,left=left,label=label,color=color,height=.8);left+=v
    names=chosen.set_index('appid')['name'].to_dict();ax.set_yticks(np.arange(len(a)),[names[k] if len(names[k])<=39 else names[k][:37]+'…' for k in a.index],fontsize=8)
    ax.invert_yaxis();ax.set_xlim(0,100);ax.set_xlabel('Share of all-language Steam-purchase reviews (%)');ax.legend(loc='upper center',bbox_to_anchor=(.5,-.08),ncol=4,frameon=False,fontsize=9)
    ax.set_title('Diagnostic profiles: games selected across English-share bands\nThis selected set is not an estimate of language-market size.',loc='left',fontweight='bold',pad=18)
    fig.tight_layout(rect=[0,.1,1,1]);fig.savefig(R/'language_profiles.png',dpi=170);fig.savefig(R/'language_profiles.svg');plt.close(fig)
