"""Count Wyscout legacy take-ons from the five 2017/18 league event files.
Usage: python reproduce_take_ons.py RAW_DATA_DIRECTORY OUTPUT_DIRECTORY
Raw source: https://doi.org/10.6084/m9.figshare.7770599.v1 (CC BY 4.0)
Players: https://figshare.com/articles/dataset/Players/7765196 (CC BY 4.0)
"""
import csv,json,sys
from pathlib import Path
from collections import defaultdict
raw=Path(sys.argv[1]);dest=Path(sys.argv[2]);dest.mkdir(parents=True,exist_ok=True)
players={p['wyId']:p for p in json.load(open(raw/'players.json'))}
counts=defaultdict(lambda:{'attempts':0,'won':0,'neutral':0,'lost':0,'leagues':set(),'matches':set()})
coverage=[];messi_events=[]
for league in ['Spain','England','Italy','France','Germany']:
 events=json.load(open(raw/f'events_{league}.json'))
 coverage.append({'league':league,'matches':len({e['matchId'] for e in events}),'events':len(events),'duplicate_event_ids':len(events)-len({e['id'] for e in events})})
 for e in events:
  player=e['playerId']
  if not player:continue
  c=counts[player];c['leagues'].add(league);c['matches'].add(e['matchId'])
  tag_ids=[tag['id'] for tag in e['tags']]
  if e['subEventId']!=11 or not any(t in (503,504) for t in tag_ids):continue
  c['attempts']+=1
  c['won']+=int(703 in tag_ids);c['neutral']+=int(702 in tag_ids);c['lost']+=int(701 in tag_ids)
  if player==3359:messi_events.append({'event_id':e['id'],'match_id':e['matchId'],'tags':';'.join(map(str,sorted(tag_ids))),'won':int(703 in tag_ids),'neutral':int(702 in tag_ids),'lost':int(701 in tag_ids)})
 del events
rows=[]
for player,c in counts.items():
 rows.append({'player_id':player,'player_name':players[player]['shortName'].encode().decode('unicode_escape'),'leagues':';'.join(sorted(c['leagues'])),'take_on_attempts':c['attempts'],'take_ons_won':c['won'],'take_ons_not_won':c['attempts']-c['won'],'win_percentage':round(100*c['won']/c['attempts'],6) if c['attempts'] else '', 'appearances_with_events':len(c['matches'])})
rows.sort(key=lambda r:(-r['take_ons_won'],-r['take_on_attempts'],r['player_name']))
for filename,data in [('messi_take_ons_full_cohort_2017_18.csv',rows),('messi_take_ons_top10_2017_18.csv',rows[:10]),('messi_take_on_event_audit.csv',messi_events)]:
 with open(dest/filename,'w') as f:
  w=csv.DictWriter(f,fieldnames=data[0]);w.writeheader();w.writerows(data)
assert len(rows)==2568
assert sum(r['take_on_attempts']>0 for r in rows)==2163
assert rows[0]['player_id']==3359 and rows[0]['take_ons_won']==159 and rows[0]['take_on_attempts']==209
assert rows[1]['player_id']==40810 and rows[1]['take_ons_won']==108
assert len(messi_events)==209 and sum(e['won'] for e in messi_events)==159
assert sum(e['neutral'] for e in messi_events)==9 and sum(e['lost'] for e in messi_events)==41
assert all(c['attempts']==c['won']+c['neutral']+c['lost'] for c in counts.values())
validation={'coverage':coverage,'distinct_players':len(rows),'players_attempting_at_least_one_take_on':2163,'messi':{'attempts':209,'won':159,'neutral':9,'lost':41,'win_percentage':159/209*100},'runner_up':{'name':'Neymar','won':108,'attempts':152},'lead_over_runner_up':51,'checks':'All assertions passed; every take-on has exactly one outcome among won, neutral and lost.'}
json.dump(validation,open(dest/'validation.json','w'),indent=2)
print(json.dumps(validation,indent=2))
