/**
  * @param FactoryInterface $productArchetypeFactory
  * @param RepositoryInterface $productOptionRepository
  * @param RepositoryInterface $productAttributeRepository
  * @param RepositoryInterface $localeRepository
  */
 public function __construct(FactoryInterface $productArchetypeFactory, RepositoryInterface $productOptionRepository, RepositoryInterface $productAttributeRepository, RepositoryInterface $localeRepository)
 {
     $this->productArchetypeFactory = $productArchetypeFactory;
     $this->localeRepository = $localeRepository;
     $this->faker = \Faker\Factory::create();
     $this->optionsResolver = (new OptionsResolver())->setDefault('name', function (Options $options) {
         return $this->faker->words(3, true);
     })->setDefault('code', function (Options $options) {
         return StringInflector::nameToCode($options['name']);
     })->setDefault('product_options', LazyOption::randomOnes($productOptionRepository, 2))->setAllowedTypes('product_options', 'array')->setNormalizer('product_options', LazyOption::findBy($productOptionRepository, 'code'))->setDefault('product_attributes', LazyOption::randomOnes($productAttributeRepository, 2))->setAllowedTypes('product_attributes', 'array')->setNormalizer('product_attributes', LazyOption::findBy($productAttributeRepository, 'code'));
 }
 /**
  * @param FactoryInterface $productFactory
  * @param FactoryInterface $productVariantFactory
  * @param ProductVariantGeneratorInterface $variantGenerator
  * @param FactoryInterface $productAttributeValueFactory
  * @param FactoryInterface $productImageFactory
  * @param ImageUploaderInterface $imageUploader
  * @param SlugGeneratorInterface $slugGenerator
  * @param RepositoryInterface $taxonRepository
  * @param RepositoryInterface $productAttributeRepository
  * @param RepositoryInterface $productOptionRepository
  * @param RepositoryInterface $channelRepository
  * @param RepositoryInterface $localeRepository
  */
 public function __construct(FactoryInterface $productFactory, FactoryInterface $productVariantFactory, ProductVariantGeneratorInterface $variantGenerator, FactoryInterface $productAttributeValueFactory, FactoryInterface $productImageFactory, ImageUploaderInterface $imageUploader, SlugGeneratorInterface $slugGenerator, RepositoryInterface $taxonRepository, RepositoryInterface $productAttributeRepository, RepositoryInterface $productOptionRepository, RepositoryInterface $channelRepository, RepositoryInterface $localeRepository)
 {
     $this->productFactory = $productFactory;
     $this->productVariantFactory = $productVariantFactory;
     $this->variantGenerator = $variantGenerator;
     $this->productImageFactory = $productImageFactory;
     $this->imageUploader = $imageUploader;
     $this->slugGenerator = $slugGenerator;
     $this->localeRepository = $localeRepository;
     $this->faker = \Faker\Factory::create();
     $this->optionsResolver = (new OptionsResolver())->setDefault('name', function (Options $options) {
         return $this->faker->words(3, true);
     })->setDefault('code', function (Options $options) {
         return StringInflector::nameToCode($options['name']);
     })->setDefault('enabled', function (Options $options) {
         return $this->faker->boolean(90);
     })->setAllowedTypes('enabled', 'bool')->setDefault('short_description', function (Options $options) {
         return $this->faker->paragraph;
     })->setDefault('description', function (Options $options) {
         return $this->faker->paragraphs(3, true);
     })->setDefault('main_taxon', LazyOption::randomOne($taxonRepository))->setAllowedTypes('main_taxon', ['null', 'string', TaxonInterface::class])->setNormalizer('main_taxon', LazyOption::findOneBy($taxonRepository, 'code'))->setDefault('taxons', LazyOption::randomOnes($taxonRepository, 3))->setAllowedTypes('taxons', 'array')->setNormalizer('taxons', LazyOption::findBy($taxonRepository, 'code'))->setDefault('channels', LazyOption::randomOnes($channelRepository, 3))->setAllowedTypes('channels', 'array')->setNormalizer('channels', LazyOption::findBy($channelRepository, 'code'))->setDefault('product_attributes', [])->setAllowedTypes('product_attributes', 'array')->setNormalizer('product_attributes', function (Options $options, array $productAttributes) use($productAttributeRepository, $productAttributeValueFactory) {
         $productAttributesValues = [];
         foreach ($productAttributes as $code => $value) {
             /** @var ProductAttributeInterface $productAttribute */
             $productAttribute = $productAttributeRepository->findOneBy(['code' => $code]);
             Assert::notNull($productAttribute);
             /** @var ProductAttributeValueInterface $productAttributeValue */
             $productAttributeValue = $productAttributeValueFactory->createNew();
             $productAttributeValue->setAttribute($productAttribute);
             $productAttributeValue->setValue($value ?: $this->getRandomValueForProductAttribute($productAttribute));
             $productAttributesValues[] = $productAttributeValue;
         }
         return $productAttributesValues;
     })->setDefault('product_options', [])->setAllowedTypes('product_options', 'array')->setNormalizer('product_options', LazyOption::findBy($productOptionRepository, 'code'))->setDefault('images', [])->setAllowedTypes('images', 'array');
 }
 /**
  * {@inheritdoc}
  */
 protected function configureOptions(OptionsResolver $resolver)
 {
     $resolver->setDefault('type', LazyOption::randomOne($this->productAssociationTypeRepository))->setAllowedTypes('type', ['string', ProductAssociationTypeInterface::class])->setNormalizer('type', LazyOption::findOneBy($this->productAssociationTypeRepository, 'code'))->setDefault('owner', LazyOption::randomOne($this->productRepository))->setAllowedTypes('owner', ['string', ProductInterface::class])->setNormalizer('owner', LazyOption::findOneBy($this->productRepository, 'code'))->setDefault('associated_products', LazyOption::randomOnes($this->productRepository, 3))->setAllowedTypes('associated_products', 'array')->setNormalizer('associated_products', LazyOption::findBy($this->productRepository, 'code'));
 }
 /**
  * {@inheritdoc}
  */
 protected function configureOptions(OptionsResolver $resolver)
 {
     $resolver->setDefault('name', function (Options $options) {
         return $this->faker->words(3, true);
     })->setDefault('code', function (Options $options) {
         return StringInflector::nameToCode($options['name']);
     })->setDefault('enabled', function (Options $options) {
         return $this->faker->boolean(90);
     })->setAllowedTypes('enabled', 'bool')->setDefault('short_description', function (Options $options) {
         return $this->faker->paragraph;
     })->setDefault('description', function (Options $options) {
         return $this->faker->paragraphs(3, true);
     })->setDefault('main_taxon', LazyOption::randomOne($this->taxonRepository))->setAllowedTypes('main_taxon', ['null', 'string', TaxonInterface::class])->setNormalizer('main_taxon', LazyOption::findOneBy($this->taxonRepository, 'code'))->setDefault('taxons', LazyOption::randomOnes($this->taxonRepository, 3))->setAllowedTypes('taxons', 'array')->setNormalizer('taxons', LazyOption::findBy($this->taxonRepository, 'code'))->setDefault('channels', LazyOption::randomOnes($this->channelRepository, 3))->setAllowedTypes('channels', 'array')->setNormalizer('channels', LazyOption::findBy($this->channelRepository, 'code'))->setDefault('variant_selection_method', ProductInterface::VARIANT_SELECTION_MATCH)->setAllowedValues('variant_selection_method', [ProductInterface::VARIANT_SELECTION_MATCH, ProductInterface::VARIANT_SELECTION_CHOICE])->setDefault('product_attributes', [])->setAllowedTypes('product_attributes', 'array')->setNormalizer('product_attributes', function (Options $options, array $productAttributes) {
         $productAttributesValues = [];
         foreach ($productAttributes as $code => $value) {
             /** @var ProductAttributeInterface $productAttribute */
             $productAttribute = $this->productAttributeRepository->findOneBy(['code' => $code]);
             Assert::notNull($productAttribute);
             /** @var ProductAttributeValueInterface $productAttributeValue */
             $productAttributeValue = $this->productAttributeValueFactory->createNew();
             $productAttributeValue->setAttribute($productAttribute);
             $productAttributeValue->setValue($value ?: $this->getRandomValueForProductAttribute($productAttribute));
             $productAttributesValues[] = $productAttributeValue;
         }
         return $productAttributesValues;
     })->setDefault('product_options', [])->setAllowedTypes('product_options', 'array')->setNormalizer('product_options', LazyOption::findBy($this->productOptionRepository, 'code'))->setDefault('images', [])->setAllowedTypes('images', 'array');
 }