import type { ViewDataBuilder } from '@/lib/contracts/builders/ViewDataBuilder'; import { DateFormatter } from '@/lib/formatters/DateFormatter'; import { FinishFormatter } from '@/lib/formatters/FinishFormatter'; import { NumberFormatter } from '@/lib/formatters/NumberFormatter'; import { PercentFormatter } from '@/lib/formatters/PercentFormatter'; import { RatingFormatter } from '@/lib/formatters/RatingFormatter'; import type { GetDriverProfileOutputDTO } from '@/lib/types/generated/GetDriverProfileOutputDTO'; import type { DriverProfileViewData } from '@/lib/view-data/DriverProfileViewData'; export class DriverProfileViewDataBuilder { public static build(apiDto: GetDriverProfileOutputDTO): DriverProfileViewData { const currentDriver = apiDto.currentDriver!; return { currentDriver: { id: currentDriver.id, name: currentDriver.name, country: currentDriver.country, avatarUrl: currentDriver.avatarUrl || '', iracingId: currentDriver.iracingId ? parseInt(currentDriver.iracingId, 10) : null, joinedAt: currentDriver.joinedAt, joinedAtLabel: DateFormatter.formatMonthYear(currentDriver.joinedAt), rating: currentDriver.rating ?? null, ratingLabel: RatingFormatter.format(currentDriver.rating), globalRank: currentDriver.globalRank ?? null, globalRankLabel: currentDriver.globalRank != null ? `#${currentDriver.globalRank}` : '—', consistency: currentDriver.consistency ?? null, bio: currentDriver.bio ?? null, totalDrivers: currentDriver.totalDrivers ?? null, } as any, stats: apiDto.stats ? { totalRaces: apiDto.stats.totalRaces, totalRacesLabel: NumberFormatter.format(apiDto.stats.totalRaces), wins: apiDto.stats.wins, winsLabel: NumberFormatter.format(apiDto.stats.wins), podiums: apiDto.stats.podiums, podiumsLabel: NumberFormatter.format(apiDto.stats.podiums), dnfs: apiDto.stats.dnfs, dnfsLabel: NumberFormatter.format(apiDto.stats.dnfs), avgFinish: apiDto.stats.avgFinish ?? null, avgFinishLabel: FinishFormatter.formatAverage(apiDto.stats.avgFinish), bestFinish: apiDto.stats.bestFinish ?? null, bestFinishLabel: FinishFormatter.format(apiDto.stats.bestFinish), worstFinish: apiDto.stats.worstFinish ?? null, worstFinishLabel: FinishFormatter.format(apiDto.stats.worstFinish), 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, ratingLabel: RatingFormatter.format(apiDto.stats.rating), consistency: apiDto.stats.consistency ?? null, consistencyLabel: PercentFormatter.formatWhole(apiDto.stats.consistency), overallRank: apiDto.stats.overallRank ?? null, } as any : null, finishDistribution: apiDto.finishDistribution ?? null, teamMemberships: apiDto.teamMemberships.map(m => ({ teamId: m.teamId, teamName: m.teamName, teamTag: m.teamTag ?? null, role: m.role, joinedAt: m.joinedAt, joinedAtLabel: DateFormatter.formatMonthYear(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, rarityLabel: a.rarity, // Placeholder earnedAt: a.earnedAt, earnedAtLabel: DateFormatter.formatShort(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, }; } } DriverProfileViewDataBuilder satisfies ViewDataBuilder;