import { Driver } from '@core/racing/domain/entities/Driver'; import { League } from '@core/racing/domain/entities/League'; import { LeagueMembership } from '@core/racing/domain/entities/LeagueMembership'; import { Race } from '@core/racing/domain/entities/Race'; import { RaceRegistration } from '@core/racing/domain/entities/RaceRegistration'; import { Result as RaceResult } from '@core/racing/domain/entities/result/Result'; import { Standing } from '@core/racing/domain/entities/Standing'; import { Team } from '@core/racing/domain/entities/Team'; import type { TeamMembership } from '@core/racing/domain/types/TeamMembership'; import type { FeedItem } from '@core/social/domain/types/FeedItem'; import { RacingDriverFactory } from './RacingDriverFactory'; import { RacingFeedFactory } from './RacingFeedFactory'; import { RacingFriendshipFactory } from './RacingFriendshipFactory'; import { RacingLeagueFactory } from './RacingLeagueFactory'; import { RacingMembershipFactory } from './RacingMembershipFactory'; import { RacingRaceFactory } from './RacingRaceFactory'; import { RacingResultFactory } from './RacingResultFactory'; import { RacingStandingFactory } from './RacingStandingFactory'; import { RacingTeamFactory } from './RacingTeamFactory'; export type Friendship = { driverId: string; friendId: string; }; export type RacingSeed = { drivers: Driver[]; leagues: League[]; races: Race[]; results: RaceResult[]; standings: Standing[]; leagueMemberships: LeagueMembership[]; raceRegistrations: RaceRegistration[]; teams: Team[]; teamMemberships: TeamMembership[]; friendships: Friendship[]; feedEvents: FeedItem[]; }; export type RacingSeedOptions = { driverCount?: number; baseDate?: Date; }; export const racingSeedDefaults: Readonly< Required > = { driverCount: 32, baseDate: new Date('2025-01-15T12:00:00.000Z'), }; class RacingSeedFactory { private readonly driverCount: number; private readonly baseDate: Date; constructor(options: RacingSeedOptions) { this.driverCount = options.driverCount ?? racingSeedDefaults.driverCount; this.baseDate = options.baseDate ?? racingSeedDefaults.baseDate; } create(): RacingSeed { const driverFactory = new RacingDriverFactory(this.driverCount, this.baseDate); const leagueFactory = new RacingLeagueFactory(this.baseDate); const raceFactory = new RacingRaceFactory(this.baseDate); const resultFactory = new RacingResultFactory(); const standingFactory = new RacingStandingFactory(); const membershipFactory = new RacingMembershipFactory(this.baseDate); const teamFactory = new RacingTeamFactory(this.baseDate); const friendshipFactory = new RacingFriendshipFactory(); const feedFactory = new RacingFeedFactory(this.baseDate); const drivers = driverFactory.create(); const leagues = leagueFactory.create(); const races = raceFactory.create(leagues); const results = resultFactory.create(drivers, races); const standings = standingFactory.create(leagues, races, results); const leagueMemberships = membershipFactory.createLeagueMemberships(drivers, leagues); const raceRegistrations = membershipFactory.createRaceRegistrations(races); const teams = teamFactory.createTeams(); const teamMemberships = teamFactory.createTeamMemberships(drivers, teams); const friendships = friendshipFactory.create(drivers); const feedEvents = feedFactory.create(drivers, friendships, races, leagues); return { drivers, leagues, races, results, standings, leagueMemberships, raceRegistrations, teams, teamMemberships, friendships, feedEvents, }; } } export function createRacingSeed(options: RacingSeedOptions = {}): RacingSeed { return new RacingSeedFactory(options).create(); }