logger = $logger ?? new NullLogger(); } /** * Resolve or generate/persist a Brand entity given an Arcadia brand code (ArcadiaId). * * @throws BrandNotFoundException */ public function resolve(ArcadiaId $arcadiaBrandCode): Brand { $existingBrand = $this->brandRepository->findByArcadiaId($arcadiaBrandCode); if ($existingBrand !== null) { return $existingBrand; } $arcadiaBrand = $this->arcadiaBrandDirectory->find($arcadiaBrandCode); if ($arcadiaBrand === null) { throw BrandNotFoundException::forArcadiaId($arcadiaBrandCode); } do { $code = $this->brandCodeGenerator->generate($arcadiaBrand->name); } while ($this->brandRepository->findByCode($code) !== null); $brand = Brand::create( name: $arcadiaBrand->name, code: $code, arcadiaId: $arcadiaBrand->id, ); $this->brandRepository->persist($brand); $this->logger->info( sprintf( 'Created new brand code "%s" for brand "%s" (Arcadia ID %d)', $code->value, $arcadiaBrand->name->value, $arcadiaBrand->id->value ), [ 'brand_id' => $brand->id()->value, 'code' => $code->value, 'name' => $arcadiaBrand->name->value, 'arcadia_id' => $arcadiaBrand->id->value, ] ); return $brand; } }