"""Exact authored examples; standard Python only. Run in this directory."""
import json
from fractions import Fraction
from pathlib import Path

ROOT = Path(__file__).resolve().parent


def summarize(stacks, hero, bb):
    if not stacks or any(type(s) is not int or s <= 0 for s in stacks):
        raise ValueError('Stacks must be positive integer chip counts.')
    if type(hero) is not int or hero not in stacks or type(bb) is not int or bb <= 0:
        raise ValueError('Hero must occur in field; BB must be a positive integer.')
    ordered = sorted(stacks)
    n = len(ordered)
    median = Fraction(ordered[n // 2]) if n % 2 else Fraction(ordered[n // 2 - 1] + ordered[n // 2], 2)
    mean = Fraction(sum(ordered), n)
    return {
        'players': n, 'totalChips': sum(ordered), 'meanChips': float(mean),
        'medianChips': float(median), 'heroChips': hero,
        'playersAboveHero': sum(s > hero for s in ordered),
        'playersBelowHero': sum(s < hero for s in ordered),
        'playersTiedWithHeroIncludingHero': ordered.count(hero),
        'heroCompetitionRank': 1 + sum(s > hero for s in ordered),
        'playersBelowMean': sum(s < mean for s in ordered),
        'bigBlindChips': bb, 'meanBB': float(mean / bb),
        'medianBB': float(median / bb), 'heroBB': float(Fraction(hero, bb)),
        'heroSharePercent': float(Fraction(hero * 100, sum(ordered))),
        'heroPercentOfMean': float(Fraction(hero * 100, 1) / mean),
    }


def build():
    inputs = json.loads((ROOT / 'inputs.json').read_text())
    results = {field: {str(bb): summarize(stacks, inputs['heroChips'], bb)
                     for bb in inputs['bigBlinds']} for field, stacks in inputs['fields'].items()}
    # A's 10,000-chip player loses every chip to its 360,000-chip leader.
    eliminated = inputs['fields']['A'][1:-1] + [370000]
    results['A_after_elimination'] = summarize(eliminated, inputs['heroChips'], 2000)
    results['A_after_elimination_BB4000'] = summarize(eliminated, inputs['heroChips'], 4000)
    (ROOT / 'results.json').write_text(json.dumps(results, indent=2) + '\n', encoding='utf-8', newline='\n')
    return results


if __name__ == '__main__':
    build()
    print('Wrote results.json: four field/unit combinations plus elimination at two blind units.')
