#!/usr/bin/env python3
"""
NBA Injury CLV Analysis
Computes cover rates and performance when key players are injured.
"""
import psycopg2
from datetime import datetime, timezone
from collections import defaultdict
import sys


def load_db_url():
    with open('/var/www/html/eventheodds/.env', 'r') as f:
        for line in f:
            if line.startswith('SPORTS_DATABASE_URL='):
                return line.split('=', 1)[1].strip().split('?')[0]
    return ''


def ingest_injury_clv(season=2024):
    db_url = load_db_url()
    if not db_url:
        raise RuntimeError('SPORTS_DATABASE_URL not set')

    conn = psycopg2.connect(db_url)
    cur = conn.cursor()
    stats_added = 0

    game_key = f'{season}_NBA_INJURY_CLV'
    game_date_base = datetime(season, 10, 1, tzinfo=timezone.utc)

    sql_team = '''
        INSERT INTO "TeamGameMetric"
        (league, season, "gameKey", "gameDate", team, "statKey", value)
        VALUES (%s, %s, %s, %s, %s, %s, %s)
        ON CONFLICT (league, season, "gameKey", team, "statKey")
        DO UPDATE SET value = EXCLUDED.value
    '''

    print(f'Fetching NBA injury data for {season}...')

    # Count injuries by team
    cur.execute('''
        SELECT team, COUNT(*) as injury_count
        FROM "PlayerInjury"
        WHERE league = 'nba' AND status IN ('Out', 'Doubtful', 'OUT', 'DOUBTFUL')
        GROUP BY team
    ''')
    injury_counts = dict(cur.fetchall())
    print(f'  Teams with injuries: {len(injury_counts)}')

    # Get games with spread data
    cur.execute('''
        SELECT "homeTeam", "awayTeam", "gameDate", "homeScore", "awayScore", "spreadHome"
        FROM "SportsGame"
        WHERE league = 'nba' AND season = %s AND status = 'Final'
          AND "spreadHome" IS NOT NULL
    ''', (season,))
    
    games = cur.fetchall()
    print(f'  Games with spread: {len(games)}')

    if len(games) == 0:
        print('  No games with spread data found')
        conn.close()
        return {'success': True, 'stats_added': 0}

    # Track performance by team when injuries exist
    team_stats = defaultdict(lambda: {'games': 0, 'covers': 0, 'margins': []})

    for home, away, gdate, hscore, ascore, spread_home in games:
        if spread_home is None or hscore is None or ascore is None:
            continue
        
        margin = hscore - ascore
        home_covered = margin > -spread_home
        
        # Count injuries for each team
        home_inj = injury_counts.get(home, 0)
        away_inj = injury_counts.get(away, 0)
        
        # Track games where opponent has injuries (advantage)
        if away_inj >= 3:  # Opponent has 3+ injuries
            team_stats[home]['games'] += 1
            team_stats[home]['margins'].append(margin + spread_home)
            if home_covered:
                team_stats[home]['covers'] += 1
        
        if home_inj >= 3:
            team_stats[away]['games'] += 1
            team_stats[away]['margins'].append(-(margin + spread_home))
            if not home_covered:
                team_stats[away]['covers'] += 1

    # Calculate and insert metrics
    for team, data in team_stats.items():
        if data['games'] < 3:
            continue
        
        cover_rate = data['covers'] / data['games']
        avg_margin = sum(data['margins']) / len(data['margins']) if data['margins'] else 0
        
        cur.execute(sql_team, ('nba', season, game_key, game_date_base, team, 'nba_vs_injured_cover_rate', float(cover_rate)))
        cur.execute(sql_team, ('nba', season, game_key, game_date_base, team, 'nba_vs_injured_margin', float(avg_margin)))
        cur.execute(sql_team, ('nba', season, game_key, game_date_base, team, 'nba_vs_injured_games', float(data['games'])))
        stats_added += 3

    conn.commit()
    cur.close()
    conn.close()

    print(f'✅ NBA injury metrics ingested: {stats_added}')
    return {'success': True, 'stats_added': stats_added}


if __name__ == '__main__':
    season = int(sys.argv[1]) if len(sys.argv) > 1 else 2024
    ingest_injury_clv(season)
