import { DateFormatter } from '@/lib/formatters/DateFormatter'; import { LeagueFormatter } from '@/lib/formatters/LeagueFormatter'; import { MemberFormatter } from '@/lib/formatters/MemberFormatter'; import { NumberFormatter } from '@/lib/formatters/NumberFormatter'; import type { GetTeamDetailsOutputDTO } from '@/lib/types/generated/GetTeamDetailsOutputDTO'; import type { SponsorMetric, TeamDetailData, TeamDetailViewData, TeamMemberData, TeamTab } from '@/lib/view-data/TeamDetailViewData'; import { ViewDataBuilder } from "../../contracts/builders/ViewDataBuilder"; export class TeamDetailViewDataBuilder implements ViewDataBuilder { build(input: any): any { return TeamDetailViewDataBuilder.build(input); } static build(apiDto: GetTeamDetailsOutputDTO): TeamDetailViewData { const team: TeamDetailData = { id: apiDto.team.id, name: apiDto.team.name, tag: apiDto.team.tag, description: apiDto.team.description, ownerId: apiDto.team.ownerId, leagues: (apiDto.team as any).leagues || [], createdAt: apiDto.team.createdAt, foundedDateLabel: apiDto.team.createdAt ? DateFormatter.formatMonthYear(apiDto.team.createdAt) : 'Unknown', specialization: (apiDto.team as any).specialization || null, region: (apiDto.team as any).region || null, languages: (apiDto.team as any).languages || [], category: (apiDto.team as any).category || null, membership: (apiDto.team as any).membership || 'open', canManage: apiDto.canManage, }; const memberships: TeamMemberData[] = ((apiDto as any).memberships || []).map((membership: any) => ({ driverId: membership.driverId, driverName: membership.driverName, role: membership.role, joinedAt: membership.joinedAt, joinedAtLabel: DateFormatter.formatShort(membership.joinedAt), isActive: membership.isActive, avatarUrl: membership.avatarUrl, })); // Calculate isAdmin based on current driver's role const currentDriverId = (apiDto as any).currentDriverId; const currentDriverMembership = memberships.find(m => m.driverId === currentDriverId); const isAdmin = currentDriverMembership?.role === 'owner' || currentDriverMembership?.role === 'manager'; // Build sponsor metrics const leagueCount = team.leagues?.length ?? 0; const teamMetrics: SponsorMetric[] = [ { icon: 'users', label: 'Members', value: NumberFormatter.format(memberships.length), color: 'text-primary-blue', }, { icon: 'zap', label: 'Est. Reach', value: NumberFormatter.format(memberships.length * 15), color: 'text-purple-400', }, { icon: 'calendar', label: 'Races', value: NumberFormatter.format(leagueCount), color: 'text-neon-aqua', }, { icon: 'users', label: 'Engagement', value: '82%', color: 'text-performance-green', }, ]; // Build tabs const tabs: TeamTab[] = [ { id: 'overview', label: 'Overview', visible: true }, { id: 'roster', label: 'Roster', visible: true }, { id: 'standings', label: 'Standings', visible: true }, { id: 'admin', label: 'Admin', visible: isAdmin }, ]; return { team, memberships, currentDriverId: currentDriverId || null, isAdmin, teamMetrics, tabs, memberCountLabel: MemberFormatter.formatCount(memberships.length), leagueCountLabel: LeagueFormatter.formatCount(leagueCount), }; } }