import { Driver } from '@core/racing/domain/entities/Driver'; import { League } from '@core/racing/domain/entities/League'; import { Team } from '@core/racing/domain/entities/Team'; import type { TeamMembership } from '@core/racing/domain/types/TeamMembership'; import { faker } from '@faker-js/faker'; export class RacingTeamFactory { constructor( private readonly baseDate: Date, private readonly drivers: Driver[], private readonly leagues: League[], ) {} createTeams(): Team[] { const teamCount = 15; return Array.from({ length: teamCount }, (_, idx) => { const i = idx + 1; const owner = faker.helpers.arrayElement(this.drivers); const teamLeagues = faker.helpers.arrayElements( this.leagues.map(l => l.id.toString()), { min: 0, max: 3 } ); return Team.create({ id: `team-${i}`, name: faker.company.name() + ' Racing', tag: faker.string.alpha({ length: 4, casing: 'upper' }), description: faker.lorem.sentences(2), ownerId: owner.id, leagues: teamLeagues, createdAt: faker.date.past({ years: 2, refDate: this.baseDate }), }); }); } createTeamMemberships(drivers: Driver[], teams: Team[]): TeamMembership[] { const memberships: TeamMembership[] = []; const usedDrivers = new Set(); teams.forEach((team, teamIndex) => { const availableDrivers = drivers.filter(d => !usedDrivers.has(d.id.toString()) && d.id.toString() !== team.ownerId.toString()); // Create varied team compositions let memberCount: number; let hasManager: boolean; if (teamIndex % 5 === 0) { // Solo teams (just owner) memberCount = 0; hasManager = false; } else if (teamIndex % 5 === 1) { // Small teams (2-3 members) memberCount = faker.number.int({ min: 1, max: 2 }); hasManager = faker.datatype.boolean(); } else if (teamIndex % 5 === 2) { // Medium teams (3-5 members) memberCount = faker.number.int({ min: 2, max: 4 }); hasManager = true; } else if (teamIndex % 5 === 3) { // Large teams (5-7 members) memberCount = faker.number.int({ min: 4, max: 6 }); hasManager = true; } else { // Mixed - sometimes with manager, sometimes without memberCount = faker.number.int({ min: 1, max: 5 }); hasManager = faker.datatype.boolean(); } const members = faker.helpers.arrayElements(availableDrivers, memberCount); // Add owner memberships.push({ teamId: team.id.toString(), driverId: team.ownerId.toString(), role: 'owner', status: 'active', joinedAt: faker.date.past({ years: 1, refDate: team.createdAt.toDate() }), }); usedDrivers.add(team.ownerId.toString()); // Add manager if needed if (hasManager && members.length > 0) { const managerIndex = faker.number.int({ min: 0, max: members.length - 1 }); const manager = members[managerIndex]!; memberships.push({ teamId: team.id.toString(), driverId: manager.id.toString(), role: 'manager', status: 'active', joinedAt: faker.date.past({ years: 1, refDate: team.createdAt.toDate() }), }); usedDrivers.add(manager.id.toString()); } // Add remaining members as drivers members.forEach((driver) => { if (!usedDrivers.has(driver.id.toString())) { memberships.push({ teamId: team.id.toString(), driverId: driver.id.toString(), role: 'driver', status: 'active', joinedAt: faker.date.past({ years: 1, refDate: team.createdAt.toDate() }), }); usedDrivers.add(driver.id.toString()); } }); }); return memberships; } }