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) => { const availableDrivers = drivers.filter(d => !usedDrivers.has(d.id.toString()) && d.id.toString() !== team.ownerId.toString()); const memberCount = faker.number.int({ min: 1, max: 8 }); 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 members members.forEach((driver) => { memberships.push({ teamId: team.id.toString(), driverId: driver.id.toString(), role: faker.helpers.arrayElement(['driver', 'manager']), status: 'active', joinedAt: faker.date.past({ years: 1, refDate: team.createdAt.toDate() }), }); usedDrivers.add(driver.id.toString()); }); }); return memberships; } }