import { ViewModel } from "../contracts/view-models/ViewModel"; import { RatingTrendFormatter } from "../formatters/RatingTrendFormatter"; import { SkillLevelFormatter } from "../formatters/SkillLevelFormatter"; import { SkillLevelIconFormatter } from "../formatters/SkillLevelIconFormatter"; import { WinRateFormatter } from "../formatters/WinRateFormatter"; import type { LeaderboardDriverItem } from '../view-data/LeaderboardDriverItem'; export class DriverLeaderboardItemViewModel extends ViewModel { private readonly data: LeaderboardDriverItem; private readonly previousRating: number | undefined; constructor(data: LeaderboardDriverItem, previousRating?: number) { super(); this.data = data; this.previousRating = previousRating; } get id(): string { return this.data.id; } get name(): string { return this.data.name; } get rating(): number { return this.data.rating; } get skillLevel(): string { return this.data.skillLevel; } get nationality(): string { return this.data.nationality; } get racesCompleted(): number { return this.data.racesCompleted; } get wins(): number { return this.data.wins; } get podiums(): number { return this.data.podiums; } get rank(): number { return this.data.rank; } get avatarUrl(): string { return this.data.avatarUrl; } get position(): number { return this.data.position; } /** UI-specific: Skill level color */ get skillLevelColor(): string { return SkillLevelFormatter.getColor(this.skillLevel); } /** UI-specific: Skill level icon */ get skillLevelIcon(): string { return SkillLevelIconFormatter.getIcon(this.skillLevel); } /** UI-specific: Win rate */ get winRate(): number { return this.racesCompleted > 0 ? (this.wins / this.racesCompleted) * 100 : 0; } /** UI-specific: Formatted win rate */ get winRateFormatted(): string { return WinRateFormatter.format(this.winRate); } /** UI-specific: Rating trend */ get ratingTrend(): 'up' | 'down' | 'same' { return RatingTrendFormatter.getTrend(this.rating, this.previousRating); } /** UI-specific: Rating change indicator */ get ratingChangeIndicator(): string { return RatingTrendFormatter.getChangeIndicator(this.rating, this.previousRating); } /** UI-specific: Position badge */ get positionBadge(): string { return this.position.toString(); } }