from pathlib import Path
from collections import Counter
from itertools import combinations
import pandas as pd,numpy as np,json,ast
R=Path(__file__).resolve().parent;g=pd.read_parquet(R/'games.parquet');checks=[]
def check(name,value):
    checks.append(dict(name=name,passed=bool(value)))
    if not value:raise AssertionError(name)
check('unique games',len(g)==g.appid.nunique()==81619)
p=pd.read_csv(R/'pair_diversity.csv');d=pd.read_csv(R/'diversity.csv');primary=pd.read_csv(R/'primary_activity.csv')
for year in [2019,2021,2023,2025]:
    a=g[g.year.eq(year)];row=p[p.period.eq(str(year))].iloc[0];counter=Counter()
    for x in a.activity_tags:counter.update(combinations(sorted(x[:5]),2))
    check('pair recount '+str(year),len(counter)==row.raw_pairs and len(a)==row.n)
    check('primary labels sum '+str(year),primary[primary.period.eq(str(year))].n.sum()==len(a))
    vals=a.primary_activity.value_counts(normalize=True).to_numpy();eff=np.exp(-(vals*np.log(vals)).sum());z=d[d.period.eq(str(year))&d.representation.eq('primary_activity')].iloc[0]
    check('entropy recount '+str(year),np.isclose(eff,z.effective_shannon))
check('rarefaction richness bounded',(p.expected_pairs_in_3000<=p.raw_pairs).all())
check('rarefaction repeated richness bounded',(p.expected_pairs_ge5_in_3000<=p.expected_pairs_in_3000).all())
n=pd.read_csv(R/'neighbor_summary.csv')
for key,a in n.groupby(['kind','configuration','seed','comparison']):check('equal neighbor pool '+str(key),a.n.nunique()==1)
check('neighbor scores bounded',n[['median','p25','p75','p90','ge08','ge09','exact']].ge(0).all().all() and n[['median','p25','p75','p90','ge08','ge09','exact']].le(1.000001).all().all())
ex=pd.read_csv(R/'neighbor_examples.csv');check('neighbors have different IDs',ex.appid.ne(ex.neighbor_appid).all());check('neighbors have different credit strings',ex.creator.ne(ex.neighbor_creator).all())
for pth in R.glob('*.py'):ast.parse(pth.read_text());check('syntax '+pth.name,True)
check('bulk network paused',json.loads((R.parent/'network_policy.json').read_text())['network_paused'])
(R/'validation.json').write_text(json.dumps({'passed':len(checks),'checks':checks},indent=2));print('Passed',len(checks),'checks')
