"""
Kalshi MLS live price checker.
Given a game date + teams, fetches the current away-win probability.
Use at halftime to check if the price is below the 11.4% break-even threshold.
"""
import requests
from datetime import date, datetime

BASE = 'https://api.elections.kalshi.com/trade-api/v2'

# MLS team name → Kalshi abbreviation
TEAM_ABR = {
    'atlanta':          'ATL',
    'austin':           'ATX',
    'charlotte':        'CLT',
    'chicago fire':     'CHI',
    'chicago':          'CHI',
    'cincinnati':       'CIN',
    'colorado':         'COL',
    'columbus':         'CLB',
    'dc united':        'DCU',
    'dallas':           'DAL',
    'houston':          'HOU',
    'kansas city':      'SKC',
    'sporting kc':      'SKC',
    'los angeles fc':   'LAFC',
    'lafc':             'LAFC',
    'la galaxy':        'LAG',
    'los angeles galaxy':'LAG',
    'miami':            'MIA',
    'inter miami':      'MIA',
    'minnesota':        'MIN',
    'montreal':         'MTL',
    'cf montreal':      'MTL',
    'nashville':        'NSH',
    'new england':      'NE',
    'new york red bulls':'NYRB',
    'red bulls':        'NYRB',
    'new york city':    'NYC',
    'nycfc':            'NYC',
    'orlando':          'ORL',
    'philadelphia':     'PHI',
    'portland':         'POR',
    'saint louis':      'STL',
    'st louis':         'STL',
    'salt lake':        'RSL',
    'real salt lake':   'RSL',
    'san diego':        'SD',
    'san jose':         'SJ',
    'seattle':          'SEA',
    'toronto':          'TOR',
    'vancouver':        'VAN',
}

COMEBACK_RATE = 0.114  # historical away win rate when down 1 at HT

def get_abr(team_name):
    t = team_name.lower().strip()
    for k, v in TEAM_ABR.items():
        if k in t or t in k:
            return v
    return None

def build_ticker(game_date, home_abr, away_abr):
    """KXMLSGAME-26APR18HOMAWAY"""
    month = game_date.strftime('%b').upper()
    day   = game_date.strftime('%d')
    year  = game_date.strftime('%y')
    return f"KXMLSGAME-{year}{month}{day}{home_abr}{away_abr}"

def get_away_price(game_date, home_team, away_team):
    home_abr = get_abr(home_team)
    away_abr = get_abr(away_team)
    if not home_abr or not away_abr:
        print(f"  Unknown team: home={home_team}→{home_abr}, away={away_team}→{away_abr}")
        return None

    event_ticker = build_ticker(game_date, home_abr, away_abr)
    market_ticker = f"{event_ticker}-{away_abr}"

    r = requests.get(f'{BASE}/markets/{market_ticker}', timeout=10)
    if r.status_code == 404:
        # Try reversed (sometimes home/away order differs)
        event_ticker2 = build_ticker(game_date, away_abr, home_abr)
        market_ticker2 = f"{event_ticker2}-{away_abr}"
        r = requests.get(f'{BASE}/markets/{market_ticker2}', timeout=10)
        if r.status_code == 404:
            print(f"  Market not found: {market_ticker} or {market_ticker2}")
            return None

    data = r.json().get('market', r.json())
    yes_ask = float(data.get('yes_ask_dollars', data.get('yes_ask', 0)))
    yes_bid = float(data.get('yes_bid_dollars', data.get('yes_bid', 0)))
    mid     = (yes_ask + yes_bid) / 2 if yes_bid > 0 else yes_ask
    return {
        'ticker':   market_ticker,
        'yes_ask':  yes_ask,
        'yes_bid':  yes_bid,
        'mid':      mid,
        'title':    data.get('title', ''),
        'status':   data.get('status', ''),
    }

def check_halftime(game_date, home_team, away_team, ht_score_home, ht_score_away):
    deficit = ht_score_away - ht_score_home
    print(f"\n{home_team} {ht_score_home}-{ht_score_away} {away_team} (HT)")

    if deficit >= 0:
        print(f"  Away team is {'winning' if deficit > 0 else 'level'} — hold.")
        return

    result = get_away_price(game_date, home_team, away_team)
    if not result:
        return

    price = result['mid'] if result['mid'] > 0 else result['yes_ask']
    ev_hold    = COMEBACK_RATE - price          # EV of holding (relative to price paid)
    buy_signal = price < COMEBACK_RATE

    print(f"  Ticker:   {result['ticker']}")
    print(f"  Price:    {price*100:.1f}%  (bid {result['yes_bid']*100:.1f}% / ask {result['yes_ask']*100:.1f}%)")
    print(f"  Comeback rate (historical): {COMEBACK_RATE*100:.1f}%")
    print(f"  Edge:     {ev_hold*100:+.1f}% ({'BUY MORE ✓' if buy_signal else 'no edge'})")

    if buy_signal:
        # Half-Kelly stake on additional buy
        b = 1/price - 1
        k = (COMEBACK_RATE * b - (1 - COMEBACK_RATE)) / b * 0.5
        print(f"  → BUY additional {k*100:.1f}% of bankroll at {price*100:.1f}¢ (fair value: {COMEBACK_RATE*100:.1f}¢)")
    else:
        print(f"  → Kalshi price ({price*100:.1f}%) ≥ historical rate ({COMEBACK_RATE*100:.1f}%) — no edge, hold original bet only")


# ── Example usage ──────────────────────────────────────────────────────────
if __name__ == '__main__':
    # Example: check a live match
    check_halftime(
        game_date   = date.today(),
        home_team   = 'New England',
        away_team   = 'DC United',
        ht_score_home = 1,
        ht_score_away = 0,
    )
