"""Recalculate the published 1221–1240 draw report using its accompanying CSV.
Usage: python recalculate-sums-1221-1240.py draws-1221-1240.csv
Python standard library only. Bonus numbers are deliberately excluded.
"""
import csv
import statistics
import sys
from collections import Counter

def calculate(path):
    with open(path, encoding='utf-8-sig', newline='') as source:
        rows = list(csv.DictReader(source))
    rounds = [int(row['round']) for row in rows]
    if sorted(rounds) != list(range(1221, 1241)):
        raise ValueError('Exactly one record for each round 1221 through 1240 is required')
    sums, odds = [], []
    for row in rows:
        nums = [int(row['n'+str(i)]) for i in range(1,7)]
        if len(set(nums)) != 6 or min(nums)<1 or max(nums)>45:
            raise ValueError('Invalid main numbers: '+row['round'])
        bonus = int(row['bonus'])
        if bonus in nums or not 1<=bonus<=45:
            raise ValueError('Invalid bonus')
        sums.append(sum(nums))
        odds.append(sum(n%2 for n in nums))
    result = {'draws':len(rows), 'mean':statistics.mean(sums),
              'median':statistics.median(sums), 'min':min(sums), 'max':max(sums),
              'odd_counts':dict(sorted(Counter(odds).items()))}
    return result

if __name__ == '__main__':
    print(calculate(sys.argv[1] if len(sys.argv)>1 else 'draws-1221-1240.csv'))
