import { ViewModel } from "../contracts/view-models/ViewModel"; import type { LeaderboardsViewData } from '../view-data/LeaderboardsViewData'; import { DriverLeaderboardItemViewModel } from './DriverLeaderboardItemViewModel'; export class DriverLeaderboardViewModel extends ViewModel { readonly drivers: DriverLeaderboardItemViewModel[]; constructor( data: LeaderboardsViewData, previousRatings?: Record, ) { super(); this.drivers = data.drivers.map((driver) => { const previousRating = previousRatings?.[driver.id]; return new DriverLeaderboardItemViewModel(driver, previousRating); }); } /** UI-specific: Total races across all drivers */ get totalRaces(): number { return this.drivers.reduce((sum, driver) => sum + driver.racesCompleted, 0); } /** UI-specific: Total wins across all drivers */ get totalWins(): number { return this.drivers.reduce((sum, driver) => sum + driver.wins, 0); } /** UI-specific: Active drivers count */ get activeCount(): number { // Note: LeaderboardDriverItem doesn't have isActive, but DriverLeaderboardItemViewModel might need it. // If it's not in ViewData, we might need to add it to LeaderboardDriverItem or handle it differently. // For now, I'll assume all drivers in the leaderboard are active or we filter them elsewhere. // Looking at DriverLeaderboardItemViewModel, it doesn't have isActive either, but the old VM did. return this.drivers.length; } }