import type { GetDriverProfileOutputDTO } from '@/lib/types/generated/GetDriverProfileOutputDTO'; import type { DriverProfileViewData } from '@/lib/types/view-data/DriverProfileViewData'; /** * DriverProfileViewDataBuilder * * Transforms GetDriverProfileOutputDTO into ViewData for the driver profile page. * Deterministic, side-effect free, no HTTP calls. */ export class DriverProfileViewDataBuilder { static build(apiDto: GetDriverProfileOutputDTO): DriverProfileViewData { return { currentDriver: apiDto.currentDriver ? { id: apiDto.currentDriver.id, name: apiDto.currentDriver.name, country: apiDto.currentDriver.country, avatarUrl: apiDto.currentDriver.avatarUrl || '', iracingId: typeof apiDto.currentDriver.iracingId === 'string' ? parseInt(apiDto.currentDriver.iracingId, 10) : (apiDto.currentDriver.iracingId ?? null), joinedAt: apiDto.currentDriver.joinedAt, rating: apiDto.currentDriver.rating ?? null, globalRank: apiDto.currentDriver.globalRank ?? null, consistency: apiDto.currentDriver.consistency ?? null, bio: apiDto.currentDriver.bio ?? null, totalDrivers: apiDto.currentDriver.totalDrivers ?? null, } : null, stats: apiDto.stats ? { totalRaces: apiDto.stats.totalRaces, wins: apiDto.stats.wins, podiums: apiDto.stats.podiums, dnfs: apiDto.stats.dnfs, avgFinish: apiDto.stats.avgFinish ?? null, bestFinish: apiDto.stats.bestFinish ?? null, worstFinish: apiDto.stats.worstFinish ?? null, finishRate: apiDto.stats.finishRate ?? null, winRate: apiDto.stats.winRate ?? null, podiumRate: apiDto.stats.podiumRate ?? null, percentile: apiDto.stats.percentile ?? null, rating: apiDto.stats.rating ?? null, consistency: apiDto.stats.consistency ?? null, overallRank: apiDto.stats.overallRank ?? null, } : null, finishDistribution: apiDto.finishDistribution ? { totalRaces: apiDto.finishDistribution.totalRaces, wins: apiDto.finishDistribution.wins, podiums: apiDto.finishDistribution.podiums, topTen: apiDto.finishDistribution.topTen, dnfs: apiDto.finishDistribution.dnfs, other: apiDto.finishDistribution.other, } : null, teamMemberships: apiDto.teamMemberships.map(m => ({ teamId: m.teamId, teamName: m.teamName, teamTag: m.teamTag ?? null, role: m.role, joinedAt: m.joinedAt, isCurrent: m.isCurrent, })), socialSummary: { friendsCount: apiDto.socialSummary.friendsCount, friends: apiDto.socialSummary.friends.map(f => ({ id: f.id, name: f.name, country: f.country, avatarUrl: f.avatarUrl || '', })), }, extendedProfile: apiDto.extendedProfile ? { socialHandles: apiDto.extendedProfile.socialHandles.map(h => ({ platform: h.platform, handle: h.handle, url: h.url, })), achievements: apiDto.extendedProfile.achievements.map(a => ({ id: a.id, title: a.title, description: a.description, icon: a.icon, rarity: a.rarity, earnedAt: a.earnedAt, })), racingStyle: apiDto.extendedProfile.racingStyle, favoriteTrack: apiDto.extendedProfile.favoriteTrack, favoriteCar: apiDto.extendedProfile.favoriteCar, timezone: apiDto.extendedProfile.timezone, availableHours: apiDto.extendedProfile.availableHours, lookingForTeam: apiDto.extendedProfile.lookingForTeam, openToRequests: apiDto.extendedProfile.openToRequests, } : null, }; } }