import { apiClient } from '@/lib/apiClient'; import type { LeagueMembership } from '@core/racing/domain/entities/LeagueMembership'; import type { MembershipRole } from '@core/racing/domain/entities/MembershipRole'; import type { MembershipStatus } from '@core/racing/domain/entities/MembershipStatus'; export class LeagueMembershipService { // In-memory cache for memberships (populated via API calls) private static leagueMemberships = new Map(); constructor() { // Constructor for dependency injection, but this service uses static methods } /** * Get a specific membership from cache. */ static getMembership(leagueId: string, driverId: string): LeagueMembership | null { const list = this.leagueMemberships.get(leagueId); if (!list) return null; return list.find((m) => m.driverId === driverId) ?? null; } /** * Get all members of a league from cache. */ static getLeagueMembers(leagueId: string): LeagueMembership[] { return [...(this.leagueMemberships.get(leagueId) ?? [])]; } /** * Fetch and cache memberships for a league via API. */ static async fetchLeagueMemberships(leagueId: string): Promise { try { const result = await apiClient.leagues.getMemberships(leagueId); const memberships: LeagueMembership[] = result.members.map(member => ({ id: `${member.driverId}-${leagueId}`, // Generate ID since API doesn't provide it leagueId, driverId: member.driverId, role: member.role as MembershipRole, status: 'active' as MembershipStatus, // Assume active since API returns current members joinedAt: member.joinedAt, })); this.setLeagueMemberships(leagueId, memberships); return memberships; } catch (error) { console.error('Failed to fetch league memberships:', error); return []; } } /** * Set memberships in cache (for use after API calls). */ static setLeagueMemberships(leagueId: string, memberships: LeagueMembership[]): void { this.leagueMemberships.set(leagueId, memberships); } /** * Clear cached memberships for a league. */ static clearLeagueMemberships(leagueId: string): void { this.leagueMemberships.delete(leagueId); } /** * Get iterator for cached memberships (for utility functions). */ static getCachedMembershipsIterator(): IterableIterator<[string, LeagueMembership[]]> { return this.leagueMemberships.entries(); } // Instance methods that delegate to static methods for consistency with service pattern /** * Get a specific membership from cache. */ getMembership(leagueId: string, driverId: string): LeagueMembership | null { return LeagueMembershipService.getMembership(leagueId, driverId); } /** * Get all members of a league from cache. */ getLeagueMembers(leagueId: string): LeagueMembership[] { return LeagueMembershipService.getLeagueMembers(leagueId); } /** * Fetch and cache memberships for a league via API. */ async fetchLeagueMemberships(leagueId: string): Promise { return LeagueMembershipService.fetchLeagueMemberships(leagueId); } /** * Set memberships in cache (for use after API calls). */ setLeagueMemberships(leagueId: string, memberships: LeagueMembership[]): void { LeagueMembershipService.setLeagueMemberships(leagueId, memberships); } /** * Clear cached memberships for a league. */ clearLeagueMemberships(leagueId: string): void { LeagueMembershipService.clearLeagueMemberships(leagueId); } }