#!/usr/bin/env npx tsx
/**
 * Update player teams from recent game logs
 */

import { PrismaClient } from '../prisma_sports/generated/sports-client';

const prisma = new PrismaClient();

function normalizePlayerName(name: string): string {
  if (!name) return '';
  return name
    .toLowerCase()
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '')
    .replace(/\s+(jr\.?|sr\.?|iii|ii|iv|v)$/i, '')
    .replace(/\./g, '')
    .replace(/\s+/g, ' ')
    .trim();
}

async function main() {
  const oneWeekAgo = new Date();
  oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);

  console.log('='.repeat(60));
  console.log('UPDATE PLAYER TEAMS FROM GAME LOGS');
  console.log('='.repeat(60));
  console.log(`Looking at games since: ${oneWeekAgo.toISOString().split('T')[0]}\n`);

  // Get all NBA player game metrics from last week
  const metrics = await prisma.playerGameMetric.findMany({
    where: {
      league: 'nba',
      gameDate: { gte: oneWeekAgo }
    },
    orderBy: { gameDate: 'desc' },
    select: { playerName: true, team: true, gameDate: true },
    distinct: ['playerName']
  });

  console.log(`Total unique players in last 7 days: ${metrics.length}\n`);

  // Get all team abbrs
  const teams = await prisma.canonicalTeam.findMany({
    where: { league: 'nba' },
    select: { id: true, abbr: true, fullName: true }
  });
  const teamMap = new Map(teams.map(t => [t.abbr, t]));

  let updated = 0;
  let notFound = 0;
  const teamChanges: Array<{ name: string; from: string; to: string; date: Date | null }> = [];

  for (const m of metrics) {
    const normalized = normalizePlayerName(m.playerName);

    const team = teamMap.get(m.team);
    if (team === undefined) continue;

    // Find and check current team
    const player = await prisma.canonicalPlayer.findFirst({
      where: { league: 'nba', normalizedName: normalized },
      include: { team: true }
    });

    if (player) {
      if (player.teamId !== team.id) {
        const oldTeam = player.team?.abbr || 'NONE';
        teamChanges.push({ name: m.playerName, from: oldTeam, to: m.team, date: m.gameDate });

        await prisma.canonicalPlayer.update({
          where: { id: player.id },
          data: { teamId: team.id }
        });
        updated++;
      }
    } else {
      notFound++;
    }
  }

  console.log(`Updated: ${updated} players`);
  console.log(`Not found in canonical: ${notFound}`);

  if (teamChanges.length > 0) {
    console.log('\n' + '='.repeat(60));
    console.log('TEAM CHANGES DETECTED');
    console.log('='.repeat(60) + '\n');
    teamChanges.forEach(c => {
      const dateStr = c.date ? c.date.toISOString().split('T')[0] : 'unknown';
      console.log(`  ${c.name}: ${c.from} → ${c.to} (played ${dateStr})`);
    });
  }

  await prisma.$disconnect();
}

main().catch((e) => {
  console.error('Update failed:', e);
  process.exit(1);
});
