import { RaceListItemViewModel } from './RaceListItemViewModel';
import type { RacesPageDataRaceDTO } from '@/lib/types/generated/RacesPageDataRaceDTO';

// DTO matching the backend RacesPageDataDTO
interface RacesPageDTO {
  races: RacesPageDataRaceDTO[];
}

/**
 * Races page view model
 * Represents the races page data with all races in a single list
 */
export class RacesPageViewModel {
  races: RaceListItemViewModel[];

  constructor(dto: RacesPageDTO) {
    this.races = dto.races.map((r) => {
      const status = 'status' in r ? r.status : 'unknown';

      const isUpcoming =
        'isUpcoming' in r ? r.isUpcoming :
        (status === 'upcoming' || status === 'scheduled');

      const isLive =
        'isLive' in r ? r.isLive :
        (status === 'live' || status === 'running');

      const isPast =
        'isPast' in r ? r.isPast :
        (status === 'completed' || status === 'finished' || status === 'cancelled');

      // Build the RaceListItemDTO from the input with proper type checking
      const scheduledAt = 'scheduledAt' in r ? r.scheduledAt : 
                         ('date' in r ? (r as { date?: string }).date : '');

      const normalized = {
        id: r.id,
        track: 'track' in r ? r.track : '',
        car: 'car' in r ? r.car : '',
        scheduledAt: scheduledAt || '',
        status: status,
        leagueId: 'leagueId' in r ? r.leagueId : '',
        leagueName: 'leagueName' in r ? r.leagueName : '',
        strengthOfField: 'strengthOfField' in r ? (r as { strengthOfField?: number }).strengthOfField ?? null : null,
        isUpcoming: Boolean(isUpcoming),
        isLive: Boolean(isLive),
        isPast: Boolean(isPast),
      };

      return new RaceListItemViewModel(normalized);
    });
  }

  /** UI-specific: Total races */
  get totalCount(): number {
    return this.races.length;
  }

  /** UI-specific: Upcoming races */
  get upcomingRaces(): RaceListItemViewModel[] {
    return this.races.filter(r => r.isUpcoming);
  }

  /** UI-specific: Live races */
  get liveRaces(): RaceListItemViewModel[] {
    return this.races.filter(r => r.isLive);
  }

  /** UI-specific: Past races */
  get pastRaces(): RaceListItemViewModel[] {
    return this.races.filter(r => r.isPast);
  }

  /** UI-specific: Scheduled races */
  get scheduledRaces(): RaceListItemViewModel[] {
    return this.races.filter(r => r.status === 'scheduled');
  }

  /** UI-specific: Running races */
  get runningRaces(): RaceListItemViewModel[] {
    return this.races.filter(r => r.status === 'running');
  }

  /** UI-specific: Completed races */
  get completedRaces(): RaceListItemViewModel[] {
    return this.races.filter(r => r.status === 'completed');
  }
}