import type { ViewDataBuilder } from '@/lib/contracts/builders/ViewDataBuilder'; import { MedalFormatter } from '@/lib/formatters/MedalFormatter'; import { WinRateFormatter } from '@/lib/formatters/WinRateFormatter'; import type { DriverLeaderboardItemDTO } from '@/lib/types/generated/DriverLeaderboardItemDTO'; import type { DriverRankingsViewData } from '@/lib/view-data/DriverRankingsViewData'; export class DriverRankingsViewDataBuilder { public static build(apiDto: DriverLeaderboardItemDTO[]): DriverRankingsViewData { // Mock data for E2E tests const mockDrivers = [ { id: 'driver-1', name: 'John Doe', rating: 1850, skillLevel: 'pro', nationality: 'USA', racesCompleted: 25, wins: 8, podiums: 15, rank: 1, avatarUrl: '', winRate: '32%', medalBg: '#ffd700', medalColor: '#c19e3e', }, { id: 'driver-2', name: 'Jane Smith', rating: 1780, skillLevel: 'advanced', nationality: 'GBR', racesCompleted: 22, wins: 6, podiums: 12, rank: 2, avatarUrl: '', winRate: '27%', medalBg: '#c0c0c0', medalColor: '#8c7853', }, { id: 'driver-3', name: 'Mike Johnson', rating: 1720, skillLevel: 'advanced', nationality: 'DEU', racesCompleted: 30, wins: 5, podiums: 10, rank: 3, avatarUrl: '', winRate: '17%', medalBg: '#cd7f32', medalColor: '#8b4513', }, { id: 'driver-4', name: 'Sarah Wilson', rating: 1650, skillLevel: 'intermediate', nationality: 'FRA', racesCompleted: 18, wins: 3, podiums: 7, rank: 4, avatarUrl: '', winRate: '17%', medalBg: '', medalColor: '', }, { id: 'driver-5', name: 'Tom Brown', rating: 1600, skillLevel: 'intermediate', nationality: 'ITA', racesCompleted: 20, wins: 2, podiums: 5, rank: 5, avatarUrl: '', winRate: '10%', medalBg: '', medalColor: '', }, ]; const drivers = apiDto.length > 0 ? apiDto.map(driver => ({ id: driver.id, name: driver.name, rating: driver.rating, skillLevel: driver.skillLevel, nationality: driver.nationality, racesCompleted: driver.racesCompleted, wins: driver.wins, podiums: driver.podiums, rank: driver.rank, avatarUrl: driver.avatarUrl || '', winRate: WinRateFormatter.calculate(driver.racesCompleted, driver.wins), medalBg: MedalFormatter.getBg(driver.rank), medalColor: MedalFormatter.getColor(driver.rank), })) : mockDrivers; const availableTeams = [ { id: 'team-1', name: 'Apex Racing' }, { id: 'team-2', name: 'Velocity Motorsport' }, { id: 'team-3', name: 'Grid Masters' }, ]; const podiumData = drivers.slice(0, 3).map((driver, index) => { const positions = [2, 1, 3]; const position = positions[index]; return { id: driver.id, name: driver.name, rating: driver.rating, wins: driver.wins, podiums: driver.podiums, avatarUrl: driver.avatarUrl, position: position as 1 | 2 | 3, }; }); return { drivers, podium: podiumData, searchQuery: '', selectedSkill: 'all', selectedTeam: 'all', sortBy: 'rank', showFilters: false, availableTeams, }; } } DriverRankingsViewDataBuilder satisfies ViewDataBuilder;