"""
Replay live_data with a CLV BAND filter [floor, cap]: for each fixture+side,
enter at the FIRST pre-kickoff snapshot where floor <= Kalshi CLV <= cap,
settle via ftr. Report flat ROI and compounded 1/4-Kelly bankroll.
Compare candidate bands.
"""
import csv, glob, os
from collections import defaultdict

os.chdir(r'E:\soccer')
files = sorted(glob.glob(r'live_data\*.csv'))
KELLY_MULT, MAX_BET_PCT, START = 0.25, 0.25, 1000.0

series = defaultdict(lambda: {'rows': [], 'ftr': None})

def fval(r, k):
    try: return float(r.get(k, ''))
    except (TypeError, ValueError): return None

for fp in files:
    with open(fp, newline='', encoding='utf-8', errors='replace') as f:
        for r in csv.DictReader(f):
            if r.get('status') != 'PRE':
                continue
            base = (r['game_date'], r['home'], r['away'])
            ftr = r.get('ftr') or None
            for side in ('home', 'away'):
                clv = fval(r, f'clv_kalshi_{side}')
                ask = fval(r, f'kalshi_{side}_ask')
                pf  = fval(r, f'pin_fair_{side}')
                d = series[base + (side,)]
                if clv is not None and ask is not None and 0 < ask < 1 and pf:
                    d['rows'].append((r['timestamp'], clv * 100, ask, pf))
                if ftr:
                    d['ftr'] = ftr

for d in series.values():
    d['rows'].sort()

def replay(floor, cap):
    entries = []
    for key, d in series.items():
        if not d['ftr']:
            continue
        win = (d['ftr'] == ('H' if key[3] == 'home' else 'A'))
        e = next(((ts, ask, pf) for ts, c, ask, pf in d['rows'] if floor <= c <= cap), None)
        if e is None:
            continue
        entries.append((e[0], e[1], e[2], win))
    entries.sort(key=lambda x: x[0])

    n = w = 0; flat = 0.0; br = START
    for ts, ask, pf, win in entries:
        n += 1
        b = (1 - ask) / ask
        f = max((pf * b - (1 - pf)) / b, 0.0)
        stake = round(min(f * KELLY_MULT, MAX_BET_PCT) * br, 2)
        if stake < 1.0: stake = 1.0
        if stake > br:  stake = round(br, 2)
        if win:
            w += 1; flat += b; br += stake * b
        else:
            flat -= 1; br -= stake
    return n, w, flat, br

print(f"{'BAND':>8}{'N':>6}{'W':>5}{'WR%':>7}{'flatROI%':>10}{'Kelly$':>10}{'Kelly%':>9}")
print('-' * 55)
for floor, cap in [(5, 12), (4, 11), (4, 12), (5, 11), (4, 10), (4, 8)]:
    n, w, flat, br = replay(floor, cap)
    flatroi = 100 * flat / n if n else 0
    print(f"{f'{floor}-{cap}':>8}{n:>6}{w:>5}{(100*w/n if n else 0):>6.1f}"
          f"{flatroi:>+10.1f}{br:>10.0f}{100*(br-START)/START:>+9.1f}")
