/**
 * Verify backtest accuracy fix
 * Compares direct database query with runStrategyBacktest output
 */

import { getSportsDb } from '../src/lib/sportsDb';
import * as directQuery from '../src/lib/directSportsQuery';

async function main() {
  console.log('═'.repeat(60));
  console.log('  BACKTEST ACCURACY VERIFICATION');
  console.log('═'.repeat(60));
  console.log();

  const db = getSportsDb();
  const season = 2026;
  const league = 'nba';

  // 1. Direct database query for NBA home underdogs 2026
  console.log('📊 Direct Database Query:');
  console.log('   NBA Home Underdogs (moneylineHome > 0, completed games, 2026)\n');

  const directGames = await db.sportsGame.findMany({
    where: {
      league: 'nba',
      season: 2026,
      homeScore: { not: null },
      awayScore: { not: null },
      moneylineHome: { gt: 0 }
    },
    orderBy: { gameDate: 'asc' }
  });

  console.log(`   Found: ${directGames.length} games`);

  // Calculate direct results
  let directWins = 0, directLosses = 0, directPushes = 0;
  let directProfit = 0;
  const stake = 100;

  for (const game of directGames) {
    const homeWon = (game.homeScore ?? 0) > (game.awayScore ?? 0);
    const tie = game.homeScore === game.awayScore;
    const odds = game.moneylineHome ?? 0;

    if (tie) {
      directPushes++;
    } else if (homeWon) {
      directWins++;
      directProfit += stake * (odds / 100);
    } else {
      directLosses++;
      directProfit -= stake;
    }
  }

  const directWagered = (directWins + directLosses) * stake;
  const directRoi = directWagered > 0 ? (directProfit / directWagered) * 100 : 0;

  console.log(`   Record: ${directWins}W - ${directLosses}L - ${directPushes}P`);
  console.log(`   Win Rate: ${((directWins / (directWins + directLosses)) * 100).toFixed(1)}%`);
  console.log(`   ROI: ${directRoi.toFixed(1)}%`);
  console.log(`   Net Profit: $${directProfit.toFixed(2)}`);
  console.log();

  // Sample games
  console.log('   Sample games:');
  directGames.slice(0, 5).forEach((g: any) => {
    const date = g.gameDate.toISOString().slice(0, 10);
    const homeWon = (g.homeScore ?? 0) > (g.awayScore ?? 0);
    const result = homeWon ? 'WIN' : 'LOSS';
    console.log(`   - ${date}: ${g.awayTeam} ${g.awayScore}-${g.homeScore} ${g.homeTeam} (ML +${g.moneylineHome}) → ${result}`);
  });
  console.log();

  // 2. Backtest function query
  console.log('─'.repeat(60));
  console.log('📈 Backtest Function Result:\n');

  const backtestResult = await directQuery.runStrategyBacktest({
    strategy: 'home underdogs',
    league: 'nba',
    season: 2026,
    stake: 100
  });

  if (backtestResult) {
    console.log(`   Found: ${backtestResult.totalBets} bets`);
    console.log(`   Record: ${backtestResult.wins}W - ${backtestResult.losses}L - ${backtestResult.pushes}P`);
    console.log(`   Win Rate: ${backtestResult.winRate.toFixed(1)}%`);
    console.log(`   ROI: ${backtestResult.roi.toFixed(1)}%`);
    console.log(`   Net Profit: $${backtestResult.netProfit.toFixed(2)}`);

    if (backtestResult.sampleBets && backtestResult.sampleBets.length > 0) {
      console.log('\n   Sample bets:');
      backtestResult.sampleBets.slice(0, 5).forEach(b => {
        console.log(`   - ${b.date}: ${b.matchup} | ${b.bet} → ${b.result.toUpperCase()} ($${b.profit.toFixed(0)})`);
      });
    }
  } else {
    console.log('   No results returned from backtest function');
  }

  // 3. Comparison
  console.log('\n' + '═'.repeat(60));
  console.log('  COMPARISON');
  console.log('═'.repeat(60));

  const gamesMatch = backtestResult?.totalBets === directGames.length;
  const winsMatch = backtestResult?.wins === directWins;
  const lossesMatch = backtestResult?.losses === directLosses;

  console.log(`\n   Games count:  Direct=${directGames.length}, Backtest=${backtestResult?.totalBets || 0} ${gamesMatch ? '✅ MATCH' : '❌ MISMATCH'}`);
  console.log(`   Wins:         Direct=${directWins}, Backtest=${backtestResult?.wins || 0} ${winsMatch ? '✅ MATCH' : '❌ MISMATCH'}`);
  console.log(`   Losses:       Direct=${directLosses}, Backtest=${backtestResult?.losses || 0} ${lossesMatch ? '✅ MATCH' : '❌ MISMATCH'}`);

  if (gamesMatch && winsMatch && lossesMatch) {
    console.log('\n   ✅ BACKTEST ACCURACY VERIFIED - Results match!');
  } else {
    console.log('\n   ❌ BACKTEST ACCURACY ISSUE - Results do not match');
    console.log('\n   Debug info:');
    console.log(`   - Direct query filters: league=nba, season=2026, moneylineHome>0, homeScore!=null`);
    console.log(`   - Check if season field exists and is populated correctly`);
  }

  console.log('\n' + '═'.repeat(60));

  process.exit(0);
}

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