#!/usr/bin/env python3
"""Enumerate draw-completion events, not showdown equity. Python 3, stdlib only."""
import csv
import json
from itertools import combinations
from pathlib import Path

ROOT = Path(__file__).resolve().parent
RANKS = '23456789TJQKA'
HERO = ['8h', '7h']
FLOP = ['Kh', '9c', '2d']
DECK = [r + s for r in RANKS for s in 'cdhs']
REMAINING = [c for c in DECK if c not in HERO + FLOP]


def events(cards):
    """Inspect all five-card subsets; event membership can overlap."""
    flush = straight = False
    for five in combinations(cards, 5):
        values = sorted({RANKS.index(c[0]) + 2 for c in five})
        flush |= len({c[1] for c in five}) == 1
        straight |= len(values) == 5 and (values[-1] - values[0] == 4 or values == [2, 3, 4, 5, 14])
    return {'flush': int(flush), 'straight': int(straight),
            'both': int(flush and straight), 'either': int(flush or straight)}


def save_csv(name, rows):
    with (ROOT / name).open('w', newline='', encoding='utf-8') as handle:
        writer = csv.DictWriter(handle, fieldnames=list(rows[0]), lineterminator='\n')
        writer.writeheader()
        writer.writerows(rows)


def main():
    runouts = [{'first': a, 'second': b, **events(HERO + FLOP + [a, b])}
               for a, b in combinations(REMAINING, 2)]
    turns = []
    for turn in REMAINING:
        rivers = [events(HERO + FLOP + [turn, river]) for river in REMAINING if river != turn]
        turns.append({'turn': turn, **{k: sum(row[k] for row in rivers) for k in rivers[0]}})
    result = {'hero': HERO, 'flop': FLOP, 'remainingCards': len(REMAINING),
              'totalRunouts': len(runouts),
              **{k: sum(row[k] for row in runouts) for k in ['flush', 'straight', 'both', 'either']},
              'activeTurns': sum(row['either'] > 0 for row in turns)}
    (ROOT / 'results.json').write_text(json.dumps(result, indent=2) + '\n', encoding='utf-8', newline='\n')
    save_csv('turns.csv', turns)
    save_csv('runouts.csv', runouts)
    print(json.dumps(result))


if __name__ == '__main__':
    main()
