#!/usr/bin/env python3
"""
Team Name Normalizer for EvenTheOdds
Ensures consistent team naming across all data sources.
"""

# NBA Team Mappings (abbreviation -> full name)
NBA_TEAMS = {
    'ATL': 'Atlanta Hawks', 'BOS': 'Boston Celtics', 'BKN': 'Brooklyn Nets',
    'CHA': 'Charlotte Hornets', 'CHI': 'Chicago Bulls', 'CLE': 'Cleveland Cavaliers',
    'DAL': 'Dallas Mavericks', 'DEN': 'Denver Nuggets', 'DET': 'Detroit Pistons',
    'GSW': 'Golden State Warriors', 'GS': 'Golden State Warriors',
    'HOU': 'Houston Rockets', 'IND': 'Indiana Pacers',
    'LAC': 'Los Angeles Clippers', 'LAL': 'Los Angeles Lakers',
    'MEM': 'Memphis Grizzlies', 'MIA': 'Miami Heat', 'MIL': 'Milwaukee Bucks',
    'MIN': 'Minnesota Timberwolves', 'NOP': 'New Orleans Pelicans', 'NO': 'New Orleans Pelicans',
    'NYK': 'New York Knicks', 'NY': 'New York Knicks',
    'OKC': 'Oklahoma City Thunder', 'ORL': 'Orlando Magic',
    'PHI': 'Philadelphia 76ers', 'PHX': 'Phoenix Suns', 'PHO': 'Phoenix Suns',
    'POR': 'Portland Trail Blazers', 'SAC': 'Sacramento Kings',
    'SAS': 'San Antonio Spurs', 'SA': 'San Antonio Spurs',
    'TOR': 'Toronto Raptors', 'UTA': 'Utah Jazz', 'WAS': 'Washington Wizards',
    # Common variations
    'ATLANTA': 'Atlanta Hawks', 'BOSTON': 'Boston Celtics', 'BROOKLYN': 'Brooklyn Nets',
    'CHARLOTTE': 'Charlotte Hornets', 'CHICAGO': 'Chicago Bulls', 'CLEVELAND': 'Cleveland Cavaliers',
    'DALLAS': 'Dallas Mavericks', 'DENVER': 'Denver Nuggets', 'DETROIT': 'Detroit Pistons',
    'GOLDEN STATE': 'Golden State Warriors', 'HOUSTON': 'Houston Rockets', 'INDIANA': 'Indiana Pacers',
    'LA CLIPPERS': 'Los Angeles Clippers', 'LA LAKERS': 'Los Angeles Lakers',
    'MEMPHIS': 'Memphis Grizzlies', 'MIAMI': 'Miami Heat', 'MILWAUKEE': 'Milwaukee Bucks',
    'MINNESOTA': 'Minnesota Timberwolves', 'NEW ORLEANS': 'New Orleans Pelicans',
    'NEW YORK': 'New York Knicks', 'OKLAHOMA CITY': 'Oklahoma City Thunder',
    'ORLANDO': 'Orlando Magic', 'PHILADELPHIA': 'Philadelphia 76ers',
    'PHOENIX': 'Phoenix Suns', 'PORTLAND': 'Portland Trail Blazers',
    'SACRAMENTO': 'Sacramento Kings', 'SAN ANTONIO': 'San Antonio Spurs',
    'TORONTO': 'Toronto Raptors', 'UTAH': 'Utah Jazz', 'WASHINGTON': 'Washington Wizards',
}

# NFL Team Mappings
NFL_TEAMS = {
    'ARI': 'Arizona Cardinals', 'ATL': 'Atlanta Falcons', 'BAL': 'Baltimore Ravens',
    'BUF': 'Buffalo Bills', 'CAR': 'Carolina Panthers', 'CHI': 'Chicago Bears',
    'CIN': 'Cincinnati Bengals', 'CLE': 'Cleveland Browns', 'DAL': 'Dallas Cowboys',
    'DEN': 'Denver Broncos', 'DET': 'Detroit Lions', 'GB': 'Green Bay Packers',
    'HOU': 'Houston Texans', 'IND': 'Indianapolis Colts', 'JAX': 'Jacksonville Jaguars',
    'KC': 'Kansas City Chiefs', 'LV': 'Las Vegas Raiders', 'LAC': 'Los Angeles Chargers',
    'LAR': 'Los Angeles Rams', 'MIA': 'Miami Dolphins', 'MIN': 'Minnesota Vikings',
    'NE': 'New England Patriots', 'NO': 'New Orleans Saints', 'NYG': 'New York Giants',
    'NYJ': 'New York Jets', 'PHI': 'Philadelphia Eagles', 'PIT': 'Pittsburgh Steelers',
    'SF': 'San Francisco 49ers', 'SEA': 'Seattle Seahawks', 'TB': 'Tampa Bay Buccaneers',
    'TEN': 'Tennessee Titans', 'WAS': 'Washington Commanders',
}

# NHL Team Mappings
NHL_TEAMS = {
    'ANA': 'Anaheim Ducks', 'ARI': 'Arizona Coyotes', 'BOS': 'Boston Bruins',
    'BUF': 'Buffalo Sabres', 'CGY': 'Calgary Flames', 'CAR': 'Carolina Hurricanes',
    'CHI': 'Chicago Blackhawks', 'COL': 'Colorado Avalanche', 'CBJ': 'Columbus Blue Jackets',
    'DAL': 'Dallas Stars', 'DET': 'Detroit Red Wings', 'EDM': 'Edmonton Oilers',
    'FLA': 'Florida Panthers', 'LAK': 'Los Angeles Kings', 'MIN': 'Minnesota Wild',
    'MTL': 'Montreal Canadiens', 'NSH': 'Nashville Predators', 'NJD': 'New Jersey Devils',
    'NYI': 'New York Islanders', 'NYR': 'New York Rangers', 'OTT': 'Ottawa Senators',
    'PHI': 'Philadelphia Flyers', 'PIT': 'Pittsburgh Penguins', 'SJS': 'San Jose Sharks',
    'SEA': 'Seattle Kraken', 'STL': 'St. Louis Blues', 'TBL': 'Tampa Bay Lightning',
    'TOR': 'Toronto Maple Leafs', 'VAN': 'Vancouver Canucks', 'VGK': 'Vegas Golden Knights',
    'WPG': 'Winnipeg Jets', 'WSH': 'Washington Capitals',
}

# MLB Team Mappings
MLB_TEAMS = {
    'ARI': 'Arizona Diamondbacks', 'ATL': 'Atlanta Braves', 'BAL': 'Baltimore Orioles',
    'BOS': 'Boston Red Sox', 'CHC': 'Chicago Cubs', 'CWS': 'Chicago White Sox',
    'CIN': 'Cincinnati Reds', 'CLE': 'Cleveland Guardians', 'COL': 'Colorado Rockies',
    'DET': 'Detroit Tigers', 'HOU': 'Houston Astros', 'KC': 'Kansas City Royals',
    'LAA': 'Los Angeles Angels', 'LAD': 'Los Angeles Dodgers', 'MIA': 'Miami Marlins',
    'MIL': 'Milwaukee Brewers', 'MIN': 'Minnesota Twins', 'NYM': 'New York Mets',
    'NYY': 'New York Yankees', 'OAK': 'Oakland Athletics', 'PHI': 'Philadelphia Phillies',
    'PIT': 'Pittsburgh Pirates', 'SD': 'San Diego Padres', 'SF': 'San Francisco Giants',
    'SEA': 'Seattle Mariners', 'STL': 'St. Louis Cardinals', 'TB': 'Tampa Bay Rays',
    'TEX': 'Texas Rangers', 'TOR': 'Toronto Blue Jays', 'WAS': 'Washington Nationals',
}

LEAGUE_MAPS = {
    'nba': NBA_TEAMS,
    'nfl': NFL_TEAMS,
    'nhl': NHL_TEAMS,
    'mlb': MLB_TEAMS,
}

def normalize_team_name(team_name: str, league: str) -> str:
    """
    Normalize a team name to its full canonical form.
    
    Args:
        team_name: The team name (could be abbreviation or full name)
        league: The league (nba, nfl, nhl, mlb)
    
    Returns:
        The full canonical team name
    """
    if not team_name:
        return team_name
    
    league = league.lower()
    team_map = LEAGUE_MAPS.get(league, {})
    
    # Check if it's already a full name (exists as a value)
    if team_name in team_map.values():
        return team_name
    
    # Try uppercase lookup
    upper_name = team_name.upper().strip()
    if upper_name in team_map:
        return team_map[upper_name]
    
    # Try without common suffixes
    for suffix in [' HORNETS', ' BULLS', ' HEAT', ' HAWKS', ' CELTICS', ' NETS', ' KNICKS', ' 76ERS', ' SIXERS']:
        if upper_name.endswith(suffix):
            base = upper_name.replace(suffix, '').strip()
            if base in team_map:
                return team_map[base]
    
    # Return original if no match found
    return team_name

def get_team_abbr(team_name: str, league: str) -> str:
    """Get the abbreviation for a team name."""
    league = league.lower()
    team_map = LEAGUE_MAPS.get(league, {})
    
    # If already an abbreviation
    upper_name = team_name.upper().strip()
    if upper_name in team_map:
        return upper_name
    
    # Find by full name
    for abbr, full_name in team_map.items():
        if full_name == team_name or full_name.upper() == upper_name:
            return abbr
    
    return team_name[:3].upper()  # Fallback

if __name__ == '__main__':
    # Test
    print(normalize_team_name('BOS', 'nba'))  # Boston Celtics
    print(normalize_team_name('LAL', 'nba'))  # Los Angeles Lakers
    print(normalize_team_name('Boston Celtics', 'nba'))  # Boston Celtics
    print(get_team_abbr('Boston Celtics', 'nba'))  # BOS
