"""Reproducible relative rankings and a data-first reference interface."""
import json, html, csv, io
from pathlib import Path
PRESETS={'balanced':{'label':'Equal domains','weights':[.2,.2,.2,.2,.2]},'living':{'label':'Living conditions','weights':[.3,.3,.1,.15,.15]},'environment':{'label':'Environmental emphasis','weights':[.2,.2,.1,.15,.35]}}
DOMAINS=['Health','Essential services','Material resources','Civic voice','Air quality']
def calculate(D):
 rows=[]
 for c in D['countries']:
  v={k:vals.get('2023') for k,vals in c['values'].items()}
  keys=['life','water','sanitation','electricity','cleancooking','income','govVA','air']
  if any(v.get(k) is None for k in keys):continue
  rows.append({'id':c['id'],'name':c['name'],'region':c['region'],'raw':{k:v[k] for k in keys},'levels':[v['life'],sum(v[k] for k in keys[1:5])/4,v['income'],v['govVA'],-v['air']]})
 n=len(rows)
 for r in rows:r['scores']=[100*(sum(o['levels'][i]<x for o in rows)+(sum(o['levels'][i]==x for o in rows)-1)/2)/(n-1) for i,x in enumerate(r['levels'])]
 for r in rows:r['totals']={k:sum(a*b for a,b in zip(r['scores'],p['weights'])) for k,p in PRESETS.items()}
 for r in rows:r['ranks']={k:1+sum(o['totals'][k]>r['totals'][k]+1e-10 for o in rows) for k in PRESETS}
 return sorted(rows,key=lambda r:(-r['totals']['balanced'],r['name']))
if __name__ == '__main__':
 import urllib.request, sys
 data=json.load(open(sys.argv[1])) if len(sys.argv)>1 else json.load(urllib.request.urlopen('https://www.pluraterra.com/assets/data.json'))
 print(json.dumps(calculate(data),indent=2))
