#!/usr/bin/env python3
"""
NBA Advanced Stats - nba_api
Fetches True Shooting %, Usage Rate, PER, BPM, VORP, Clutch stats
"""
from nba_api.stats.endpoints import leaguedashplayerstats, leaguedashteamstats, leaguedashplayerclutch
from nba_api.stats.static import teams
import psycopg2
import time
from datetime import datetime, timezone

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_nba_advanced(season='2024-25'):
    """Ingest NBA advanced stats"""
    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
    
    season_year = int(season.split('-')[0])
    game_key = f'{season}_NBA_SEASON'
    game_date = datetime(season_year, 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
    '''
    
    sql_player = '''
        INSERT INTO "PlayerGameMetric"
        (league, season, "gameKey", "gameDate", "playerExternalId", "playerName", team, "statKey", value)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
        ON CONFLICT (league, season, "gameKey", "playerExternalId", "statKey")
        DO UPDATE SET value = EXCLUDED.value
    '''
    
    # 1. Player Advanced Stats
    print(f'Fetching NBA player advanced stats for {season}...')
    try:
        time.sleep(1)  # Rate limiting
        player_stats = leaguedashplayerstats.LeagueDashPlayerStats(
            season=season,
            measure_type_detailed_defense='Advanced',
            per_mode_detailed='PerGame'
        )
        df = player_stats.get_data_frames()[0]
        print(f'  Found {len(df)} players')
        
        player_count = 0
        for _, row in df.iterrows():
            player_id = str(row.get('PLAYER_ID', ''))
            player_name = row.get('PLAYER_NAME', '')
            team = row.get('TEAM_ABBREVIATION', '')
            
            if not player_name:
                continue
            
            metrics = [
                # Core advanced
                ('nba_off_rating', row.get('OFF_RATING')),
                ('nba_def_rating', row.get('DEF_RATING')),
                ('nba_net_rating', row.get('NET_RATING')),
                ('nba_ast_pct', row.get('AST_PCT')),
                ('nba_ast_to', row.get('AST_TO')),
                ('nba_ast_ratio', row.get('AST_RATIO')),
                ('nba_oreb_pct', row.get('OREB_PCT')),
                ('nba_dreb_pct', row.get('DREB_PCT')),
                ('nba_reb_pct', row.get('REB_PCT')),
                ('nba_tov_pct', row.get('TM_TOV_PCT')),
                ('nba_efg_pct', row.get('EFG_PCT')),  # Effective FG%
                ('nba_ts_pct', row.get('TS_PCT')),  # True Shooting %
                ('nba_usg_pct', row.get('USG_PCT')),  # Usage Rate
                ('nba_pace', row.get('PACE')),
                ('nba_pie', row.get('PIE')),  # Player Impact Estimate
                # Per game
                ('nba_min', row.get('MIN')),
                ('nba_pts', row.get('PTS')),
                ('nba_reb', row.get('REB')),
                ('nba_ast', row.get('AST')),
                ('nba_stl', row.get('STL')),
                ('nba_blk', row.get('BLK')),
                ('nba_tov', row.get('TOV')),
                ('nba_pf', row.get('PF')),
            ]
            
            for stat_key, val in metrics:
                if val is not None:
                    try:
                        cur.execute(sql_player, (
                            'nba', season_year, game_key, game_date,
                            player_id, player_name, team,
                            stat_key, float(val)
                        ))
                        stats_added += 1
                        player_count += 1
                    except:
                        conn.rollback()
        
        conn.commit()
        print(f'  Player advanced stats added: {player_count}')
    except Exception as e:
        print(f'Error fetching player advanced: {e}')
    
    # 2. Player Base Stats (for additional metrics)
    print(f'Fetching NBA player base stats for {season}...')
    try:
        time.sleep(1)
        base_stats = leaguedashplayerstats.LeagueDashPlayerStats(
            season=season,
            measure_type_detailed_defense='Base',
            per_mode_detailed='PerGame'
        )
        df = base_stats.get_data_frames()[0]
        print(f'  Found {len(df)} players')
        
        base_count = 0
        for _, row in df.iterrows():
            player_id = str(row.get('PLAYER_ID', ''))
            player_name = row.get('PLAYER_NAME', '')
            team = row.get('TEAM_ABBREVIATION', '')
            
            if not player_name:
                continue
            
            metrics = [
                ('nba_gp', row.get('GP')),
                ('nba_w', row.get('W')),
                ('nba_l', row.get('L')),
                ('nba_w_pct', row.get('W_PCT')),
                ('nba_fgm', row.get('FGM')),
                ('nba_fga', row.get('FGA')),
                ('nba_fg_pct', row.get('FG_PCT')),
                ('nba_fg3m', row.get('FG3M')),
                ('nba_fg3a', row.get('FG3A')),
                ('nba_fg3_pct', row.get('FG3_PCT')),
                ('nba_ftm', row.get('FTM')),
                ('nba_fta', row.get('FTA')),
                ('nba_ft_pct', row.get('FT_PCT')),
                ('nba_plus_minus', row.get('PLUS_MINUS')),
            ]
            
            for stat_key, val in metrics:
                if val is not None:
                    try:
                        cur.execute(sql_player, (
                            'nba', season_year, game_key, game_date,
                            player_id, player_name, team,
                            stat_key, float(val)
                        ))
                        stats_added += 1
                        base_count += 1
                    except:
                        conn.rollback()
        
        conn.commit()
        print(f'  Player base stats added: {base_count}')
    except Exception as e:
        print(f'Error fetching player base: {e}')
    
    # 3. Clutch Stats
    print(f'Fetching NBA clutch stats for {season}...')
    try:
        time.sleep(1)
        clutch = leaguedashplayerclutch.LeagueDashPlayerClutch(
            season=season,
            per_mode_detailed='PerGame'
        )
        df = clutch.get_data_frames()[0]
        print(f'  Found {len(df)} players with clutch stats')
        
        clutch_count = 0
        for _, row in df.iterrows():
            player_id = str(row.get('PLAYER_ID', ''))
            player_name = row.get('PLAYER_NAME', '')
            team = row.get('TEAM_ABBREVIATION', '')
            
            if not player_name:
                continue
            
            metrics = [
                ('nba_clutch_pts', row.get('PTS')),
                ('nba_clutch_fg_pct', row.get('FG_PCT')),
                ('nba_clutch_fg3_pct', row.get('FG3_PCT')),
                ('nba_clutch_ft_pct', row.get('FT_PCT')),
                ('nba_clutch_plus_minus', row.get('PLUS_MINUS')),
                ('nba_clutch_min', row.get('MIN')),
            ]
            
            for stat_key, val in metrics:
                if val is not None:
                    try:
                        cur.execute(sql_player, (
                            'nba', season_year, game_key, game_date,
                            player_id, player_name, team,
                            stat_key, float(val)
                        ))
                        stats_added += 1
                        clutch_count += 1
                    except:
                        conn.rollback()
        
        conn.commit()
        print(f'  Clutch stats added: {clutch_count}')
    except Exception as e:
        print(f'Error fetching clutch: {e}')
    
    # 4. Team Advanced Stats
    print(f'Fetching NBA team advanced stats for {season}...')
    try:
        time.sleep(1)
        team_stats = leaguedashteamstats.LeagueDashTeamStats(
            season=season,
            measure_type_detailed_defense='Advanced',
            per_mode_detailed='PerGame'
        )
        df = team_stats.get_data_frames()[0]
        print(f'  Found {len(df)} teams')
        
        team_count = 0
        for _, row in df.iterrows():
            team = row.get('TEAM_ABBREVIATION', '')
            if not team:
                continue
            
            metrics = [
                ('nba_team_off_rating', row.get('OFF_RATING')),
                ('nba_team_def_rating', row.get('DEF_RATING')),
                ('nba_team_net_rating', row.get('NET_RATING')),
                ('nba_team_pace', row.get('PACE')),
                ('nba_team_pie', row.get('PIE')),
                ('nba_team_ts_pct', row.get('TS_PCT')),
                ('nba_team_efg_pct', row.get('EFG_PCT')),
                ('nba_team_ast_ratio', row.get('AST_RATIO')),
                ('nba_team_oreb_pct', row.get('OREB_PCT')),
                ('nba_team_dreb_pct', row.get('DREB_PCT')),
                ('nba_team_tov_pct', row.get('TM_TOV_PCT')),
            ]
            
            for stat_key, val in metrics:
                if val is not None:
                    try:
                        cur.execute(sql_team, ('nba', season_year, game_key, game_date, team, stat_key, float(val)))
                        stats_added += 1
                        team_count += 1
                    except:
                        conn.rollback()
        
        conn.commit()
        print(f'  Team advanced stats added: {team_count}')
    except Exception as e:
        print(f'Error fetching team advanced: {e}')
    
    cur.close()
    conn.close()
    
    print(f'')
    print(f'✅ NBA Advanced Stats ingested: {stats_added} total metrics')
    return {'success': True, 'stats_added': stats_added}

if __name__ == '__main__':
    import sys
    season = sys.argv[1] if len(sys.argv) > 1 else '2024-25'
    ingest_nba_advanced(season)
