import type { ValueObject } from '@core/shared/domain/ValueObject'; import { RacingDomainValidationError } from '../errors/RacingDomainError'; export interface DecalOverrideProps { leagueId: string; seasonId: string; decalId: string; newX: number; newY: number; } export class DecalOverride implements ValueObject { readonly leagueId: string; readonly seasonId: string; readonly decalId: string; readonly newX: number; readonly newY: number; private constructor(props: DecalOverrideProps) { this.leagueId = props.leagueId; this.seasonId = props.seasonId; this.decalId = props.decalId; this.newX = props.newX; this.newY = props.newY; } static create(props: DecalOverrideProps): DecalOverride { this.validate(props); return new DecalOverride(props); } private static validate(props: DecalOverrideProps): void { if (!props.leagueId || props.leagueId.trim().length === 0) { throw new RacingDomainValidationError('DecalOverride leagueId is required'); } if (!props.seasonId || props.seasonId.trim().length === 0) { throw new RacingDomainValidationError('DecalOverride seasonId is required'); } if (!props.decalId || props.decalId.trim().length === 0) { throw new RacingDomainValidationError('DecalOverride decalId is required'); } if (props.newX < 0 || props.newX > 1) { throw new RacingDomainValidationError('DecalOverride newX must be between 0 and 1'); } if (props.newY < 0 || props.newY > 1) { throw new RacingDomainValidationError('DecalOverride newY must be between 0 and 1'); } } equals(other: ValueObject): boolean { const a = this.props; const b = other.props; return ( a.leagueId === b.leagueId && a.seasonId === b.seasonId && a.decalId === b.decalId && a.newX === b.newX && a.newY === b.newY ); } get props(): DecalOverrideProps { return { leagueId: this.leagueId, seasonId: this.seasonId, decalId: this.decalId, newX: this.newX, newY: this.newY, }; } }