// ABOUTME: Demo script to test TAB API client functionality
// ABOUTME: Verifies API connectivity, metrics, tracing, and data retrieval

import { TabApiClient } from './tab-api-client';
import config from '../../config';
import logger from '../../utils/logger';

async function demo() {
  logger.info('🏇 TAB API Client Demo');
  logger.info('='.repeat(50));

  // Create client
  const client = new TabApiClient({
    baseUrl: config.tabApi.baseUrl,
    timeout: 15000,
    maxRetries: config.rateLimiting.retryAttempts,
    retryDelay: config.rateLimiting.retryDelayMs,
    rateLimitPerMinute: config.rateLimiting.perMinute,
  });

  logger.info({ config: {
    baseUrl: config.tabApi.baseUrl,
    rateLimitPerMinute: config.rateLimiting.perMinute,
  }}, 'Client configured');

  try {
    // Demo 1: Get today's meetings
    logger.info('\n📋 Demo 1: Fetching today\'s Australian thoroughbred meetings...');
    const meetings = await client.getMeetings({
      category: 'T',
      country: 'AUS',
      dateFrom: 'today',
      dateTo: 'today',
      limit: 3,
    });

    logger.info({ count: meetings.data.meetings.length }, 'Meetings fetched');

    meetings.data.meetings.forEach((meeting, index) => {
      logger.info({
        index: index + 1,
        name: meeting.name,
        state: meeting.state,
        races: meeting.races.length,
        trackCondition: meeting.track_condition,
      }, 'Meeting details');
    });

    // Demo 2: Get meeting by ID
    if (meetings.data.meetings.length > 0) {
      const meetingId = meetings.data.meetings[0].meeting;

      logger.info('\n🔍 Demo 2: Fetching meeting details by ID...');
      const meetingDetails = await client.getMeetingById(meetingId);

      const meeting = meetingDetails.data.meetings[0];
      logger.info({
        id: meeting.meeting,
        name: meeting.name,
        races: meeting.races.length,
      }, 'Meeting details fetched');

      // Show first race
      if (meeting.races.length > 0) {
        const firstRace = meeting.races[0];
        logger.info({
          raceNumber: firstRace.race_number,
          name: firstRace.name,
          distance: `${firstRace.distance}m`,
          startTime: firstRace.start_time,
          status: firstRace.status,
        }, 'First race details');
      }
    }

    // Demo 3: Rate limiter status
    logger.info('\n⚡ Demo 3: Rate limiter status');
    const rateLimitStatus = client.getRateLimitStatus();
    logger.info(rateLimitStatus, 'Rate limiter status');

    logger.info('\n✅ Demo completed successfully!');
    logger.info('📊 Check observability:');
    logger.info('   - Jaeger traces: http://localhost:16686');
    logger.info('   - Prometheus metrics: http://localhost:9091/metrics');
    logger.info('   - Grafana dashboards: http://localhost:3000');

  } catch (error) {
    logger.error({ error: error instanceof Error ? error.message : 'Unknown error' }, 'Demo failed');
    process.exit(1);
  }
}

// Run demo if executed directly
if (require.main === module) {
  demo().catch((error) => {
    logger.error({ error }, 'Unhandled error in demo');
    process.exit(1);
  });
}

export { demo };
