from datetime import datetime, timezone
from .db import get_conn


def log_bet(
    game_date: str,
    event_desc: str,
    market: str,
    selection: str,
    odds_taken: float,
    stake: float,
    sport: str = "nba",
    game_id: str | None = None,
    team_home: str | None = None,
    team_away: str | None = None,
    player_name: str | None = None,
    stat_type: str | None = None,
    line: float | None = None,
    direction: str | None = None,
    odds_open: float | None = None,
    book: str = "superbet_ro",
    model_edge_pct: float | None = None,
    rationale: str | None = None,
    notes: str | None = None,
) -> int:
    placed_at = datetime.now(timezone.utc).isoformat()
    with get_conn() as conn:
        cur = conn.execute(
            """INSERT INTO bets (
                placed_at, sport, game_date, game_id, event_desc,
                team_home, team_away, market, player_name, stat_type,
                line, direction, selection, odds_taken, odds_open,
                stake, book, model_edge_pct, rationale, notes
            ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""",
            (placed_at, sport, game_date, game_id, event_desc,
             team_home, team_away, market, player_name, stat_type,
             line, direction, selection, odds_taken, odds_open,
             stake, book, model_edge_pct, rationale, notes),
        )
        return cur.lastrowid


def settle_bet(bet_id: int, status: str, payout: float) -> None:
    if status not in ("won", "lost", "push", "void"):
        raise ValueError(f"invalid status: {status}")
    with get_conn() as conn:
        conn.execute(
            "UPDATE bets SET status=?, payout=? WHERE id=?",
            (status, payout, bet_id),
        )


def close_bet(bet_id: int, closing_odds: float) -> float | None:
    """Record closing line, return CLV% or None if bet not found."""
    with get_conn() as conn:
        conn.execute("UPDATE bets SET odds_close=? WHERE id=?", (closing_odds, bet_id))
        row = conn.execute(
            "SELECT odds_taken FROM bets WHERE id=?", (bet_id,)
        ).fetchone()
    if not row:
        return None
    return compute_clv(row["odds_taken"], closing_odds)


def compute_clv(odds_taken: float, odds_close: float) -> float:
    """CLV as percentage. Positive = you beat the closing line."""
    return ((1 / odds_close) - (1 / odds_taken)) / (1 / odds_taken) * 100
