"""
Bet ledger — appends every placement attempt to bets.csv.

Each row records the full arb context plus placement outcome for both legs,
so you can track P&L, rejection rates, and odds drift over time.
"""
import csv
import os
from datetime import datetime
from typing import Optional

LEDGER_PATH = os.path.join(os.path.dirname(__file__), '..', 'bets.csv')

FIELDNAMES = [
    'timestamp', 'mode',
    'sport', 'home_team', 'away_team', 'market', 'league',
    # Leg A (bookmaker with best odds for first outcome)
    'bm_a', 'outcome_a', 'odds_a', 'verified_odds_a', 'stake_a',
    'bet_id_a', 'status_a', 'error_a',
    # Leg B
    'bm_b', 'outcome_b', 'odds_b', 'verified_odds_b', 'stake_b',
    'bet_id_b', 'status_b', 'error_b',
    # For 3-outcome arbs (e.g. 1X2 with a 3rd leg)
    'bm_c', 'outcome_c', 'odds_c', 'verified_odds_c', 'stake_c',
    'bet_id_c', 'status_c', 'error_c',
    # Summary
    'total_stake', 'expected_profit', 'profit_pct',
    'overall_status',  # 'all_placed' | 'partial' | 'failed' | 'aborted'
    'notes',
]


def log_bet(
    mode:        str,
    sport:       str,
    home_team:   str,
    away_team:   str,
    market:      str,
    league:      str,
    legs:        list,         # list of LegStake objects
    results:     list,         # list of BetResult objects (same order as legs)
    verified_odds: list,       # list of float|None (same order as legs)
    total_stake: float,
    expected_profit: float,
    profit_pct:  float,
    notes:       str = '',
) -> None:
    """Append one bet record. Missing values are written as empty strings."""

    all_ok   = all(r.success for r in results)
    any_ok   = any(r.success for r in results)
    if all_ok:
        overall = 'all_placed'
    elif any_ok:
        overall = 'partial'
    elif not results:
        overall = 'aborted'
    else:
        overall = 'failed'

    record = {
        'timestamp':       datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
        'mode':            mode,
        'sport':           sport,
        'home_team':       home_team,
        'away_team':       away_team,
        'market':          market,
        'league':          league,
        'total_stake':     round(total_stake, 2),
        'expected_profit': round(expected_profit, 2),
        'profit_pct':      round(profit_pct, 3),
        'overall_status':  overall,
        'notes':           notes,
    }

    suffixes = ['a', 'b', 'c']
    for i, (leg, result) in enumerate(zip(legs, results)):
        s = suffixes[i] if i < len(suffixes) else str(i)
        record[f'bm_{s}']           = leg.bookmaker
        record[f'outcome_{s}']      = leg.outcome
        record[f'odds_{s}']         = leg.odds
        record[f'verified_odds_{s}']= verified_odds[i] if i < len(verified_odds) else ''
        record[f'stake_{s}']        = leg.stake
        record[f'bet_id_{s}']       = result.bet_id or ''
        record[f'status_{s}']       = 'ok' if result.success else 'failed'
        record[f'error_{s}']        = '' if result.success else result.message

    write_header = not os.path.exists(LEDGER_PATH)
    with open(LEDGER_PATH, 'a', newline='') as f:
        writer = csv.DictWriter(f, fieldnames=FIELDNAMES, extrasaction='ignore')
        if write_header:
            writer.writeheader()
        writer.writerow({k: record.get(k, '') for k in FIELDNAMES})
