import type { IRaceProtestsPresenter, RaceProtestViewModel, RaceProtestsViewModel, } from '@gridpilot/racing/application/presenters/IRaceProtestsPresenter'; import type { ProtestStatus, ProtestIncident } from '@gridpilot/racing/domain/entities/Protest'; export class RaceProtestsPresenter implements IRaceProtestsPresenter { private viewModel: RaceProtestsViewModel | null = null; present( protests: Array<{ id: string; raceId: string; protestingDriverId: string; accusedDriverId: string; incident: ProtestIncident; comment?: string; proofVideoUrl?: string; status: ProtestStatus; reviewedBy?: string; decisionNotes?: string; filedAt: Date; reviewedAt?: Date; }>, driverMap: Map ): RaceProtestsViewModel { const protestViewModels: RaceProtestViewModel[] = protests.map(protest => ({ id: protest.id, raceId: protest.raceId, protestingDriverId: protest.protestingDriverId, protestingDriverName: driverMap.get(protest.protestingDriverId) || 'Unknown', accusedDriverId: protest.accusedDriverId, accusedDriverName: driverMap.get(protest.accusedDriverId) || 'Unknown', incident: protest.incident, comment: protest.comment, proofVideoUrl: protest.proofVideoUrl, status: protest.status, reviewedBy: protest.reviewedBy, reviewedByName: protest.reviewedBy ? driverMap.get(protest.reviewedBy) : undefined, decisionNotes: protest.decisionNotes, filedAt: protest.filedAt.toISOString(), reviewedAt: protest.reviewedAt?.toISOString(), })); this.viewModel = { protests: protestViewModels, }; return this.viewModel; } getViewModel(): RaceProtestsViewModel { if (!this.viewModel) { throw new Error('Presenter has not been called yet'); } return this.viewModel; } }