/**
 * Test script for PreRaceScheduler
 *
 * Tests both T-60 and T-15 pre-race update schedulers
 */

import { PrismaClient } from '@prisma/client';
import { TabApiClient } from '../src/api/tab';
import { PreRaceScheduler } from '../src/schedulers/pre-race-scheduler';
import { ScheduleType } from '../src/schedulers/types';
import logger from '../src/utils/logger';
import { DateTime } from 'luxon';
import * as dotenv from 'dotenv';

// Load environment variables
dotenv.config();

const prisma = new PrismaClient();

async function main() {
  console.log('🧪 Testing PreRaceScheduler\n');
  console.log('═══════════════════════════════════════\n');

  try {
    // Initialize API client with config
    const apiClient = new TabApiClient({
      baseUrl: process.env.TAB_API_BASE_URL || 'https://api.tab.co.nz',
      timeout: 10000,
    });

    // Check current races in the database
    const now = DateTime.now().setZone('Pacific/Auckland');
    console.log(`⏰ Current time (NZ): ${now.toFormat('yyyy-MM-dd HH:mm:ss')}\n`);

    // Find races in the next 2 hours
    const twoHoursAhead = now.plus({ hours: 2 }).toJSDate();
    const upcomingRaces = await prisma.race.findMany({
      where: {
        startTime: {
          gte: now.toJSDate(),
          lte: twoHoursAhead,
        },
        status: {
          not: 'CLOSED',
        },
      },
      include: {
        meeting: {
          select: {
            name: true,
            date: true,
          },
        },
      },
      orderBy: {
        startTime: 'asc',
      },
      take: 20,
    });

    console.log(`📊 Found ${upcomingRaces.length} races in the next 2 hours:`);

    if (upcomingRaces.length === 0) {
      console.log('   ⚠️  No upcoming races found. Tests will not find matches.\n');
    } else {
      upcomingRaces.forEach((race, i) => {
        const raceTime = DateTime.fromJSDate(race.startTime).setZone('Pacific/Auckland');
        const minutesUntil = Math.round(raceTime.diff(now, 'minutes').minutes);

        const inT60Window = minutesUntil >= 55 && minutesUntil <= 65;
        const inT15Window = minutesUntil >= 10 && minutesUntil <= 20;

        let marker = '';
        if (inT60Window) marker = ' ← T-60 window';
        if (inT15Window) marker = ' ← T-15 window';

        console.log(`   ${i + 1}. ${race.meeting.name} R${race.raceNumber} - ${raceTime.toFormat('HH:mm')} (${minutesUntil} min)${marker}`);
      });
      console.log('');
    }

    // Test T-60 Scheduler
    console.log('═══════════════════════════════════════');
    console.log('📋 Testing PRE_RACE_T60 Scheduler');
    console.log('═══════════════════════════════════════\n');
    console.log('Time Window: 55-65 minutes before race start');
    console.log('Runs: Every 5 minutes\n');

    const schedulerT60 = new PreRaceScheduler(
      apiClient,
      prisma,
      ScheduleType.PRE_RACE_T60
    );

    console.log('⚡ Triggering T-60 scheduler manually...\n');
    const resultT60 = await schedulerT60.triggerManually();

    console.log('Results:');
    console.log(`  Success: ${resultT60.success ? '✅' : '❌'}`);
    console.log(`  Races checked: ${resultT60.itemsProcessed}`);
    console.log(`  Meetings updated: ${resultT60.metadata?.meetingsUpdated || 0}`);
    console.log(`  Duration: ${(resultT60.durationMs / 1000).toFixed(2)}s`);
    console.log(`  Errors: ${resultT60.errors.length}`);

    if (resultT60.errors.length > 0) {
      console.log('\n  ⚠️  Errors encountered:');
      resultT60.errors.forEach((err, i) => {
        console.log(`    ${i + 1}. ${err}`);
      });
    }

    console.log('\n');

    // Test T-15 Scheduler
    console.log('═══════════════════════════════════════');
    console.log('📋 Testing PRE_RACE_T15 Scheduler');
    console.log('═══════════════════════════════════════\n');
    console.log('Time Window: 10-20 minutes before race start');
    console.log('Runs: Every 5 minutes\n');

    const schedulerT15 = new PreRaceScheduler(
      apiClient,
      prisma,
      ScheduleType.PRE_RACE_T15
    );

    console.log('⚡ Triggering T-15 scheduler manually...\n');
    const resultT15 = await schedulerT15.triggerManually();

    console.log('Results:');
    console.log(`  Success: ${resultT15.success ? '✅' : '❌'}`);
    console.log(`  Races checked: ${resultT15.itemsProcessed}`);
    console.log(`  Meetings updated: ${resultT15.metadata?.meetingsUpdated || 0}`);
    console.log(`  Duration: ${(resultT15.durationMs / 1000).toFixed(2)}s`);
    console.log(`  Errors: ${resultT15.errors.length}`);

    if (resultT15.errors.length > 0) {
      console.log('\n  ⚠️  Errors encountered:');
      resultT15.errors.forEach((err, i) => {
        console.log(`    ${i + 1}. ${err}`);
      });
    }

    console.log('\n');
    console.log('═══════════════════════════════════════');
    console.log('✅ PreRaceScheduler Test Complete');
    console.log('═══════════════════════════════════════\n');

    // Summary
    console.log('📊 Summary:');
    console.log(`  • Total upcoming races: ${upcomingRaces.length}`);
    console.log(`  • T-60 updates: ${resultT60.itemsProcessed}`);
    console.log(`  • T-15 updates: ${resultT15.itemsProcessed}`);
    console.log(`  • Total errors: ${resultT60.errors.length + resultT15.errors.length}`);
    console.log('');

    console.log('💡 Note: The schedulers will automatically run every 5 minutes');
    console.log('   when the application is started with npm run dev\n');

  } catch (error) {
    console.error('❌ Test failed:', error);
    throw error;
  } finally {
    await prisma.$disconnect();
  }
}

main();
