public async Task <ValidationResult> ValidateUpdateProductVariant(UpdateProductVariantInput input)
        {
            ValidationResult validationResult = new();

            foreach (var item in input.Variants)
            {
                if (string.IsNullOrWhiteSpace(item.Name))
                {
                    validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "Debe ingresar un nombre para la variante."));
                }
                else if (item.Name.HasFileInvalidChars())
                {
                    validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "El nombre no puede contener caracteres invalidos (<, >, :, \", /, \\, |, ?, *)."));
                }
                else if (!item.Values.Any())
                {
                    validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "No se puede crear una variante sin valores."));
                }
                else if (item.Values.GroupBy(x => x).Any(g => g.Count() > 1))
                {
                    validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "No pueden haber valores de una variante repetidos."));
                }
                else if (SubCategoriesHasInvalidChars())
                {
                    validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "El nombre de los valores no puede contener caracteres invalidos (<, >, :, \", /, \\, |, ?, *)."));
                }

                bool SubCategoriesHasInvalidChars()
                {
                    foreach (var value in item.Values)
                    {
                        if (value.HasFileInvalidChars())
                        {
                            return(true);
                        }
                    }

                    return(false);
                }
            }

            var product = await _productRepository.GetAsync(input.ProductId);

            if (product is null)
            {
                validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.ProductId), "El producto no existe."));
            }



            return(validationResult);
        }
        public async Task <OperationResultEnumerable <ProductVariantDto> > UpdateAsync(UpdateProductVariantInput input)
        {
            var validationResult = await _productVariantValidator.ValidateUpdateProductVariant(input);

            if (validationResult.IsSuccess)
            {
                var taskGetVariants = _productVariantRepository.GetByProduct(new() { Id = input.ProductId });

                foreach (var variant in input.Variants)
                {
                    var entity = await _productVariantRepository.GetByNameAsync(new() { Id = input.ProductId }, variant.Name);

                    if (entity is null)
                    {
                        await _productVariantRepository.CreateAsync(new()
                        {
                            Name      = variant.Name,
                            ProductId = input.ProductId,
                            Values    = variant.Values
                        });
                    }
                    else
                    {
                        await _productVariantRepository.UpdateAsync(new()
                        {
                            Id        = entity.Id,
                            Name      = variant.Name,
                            ProductId = input.ProductId,
                            Values    = variant.Values
                        });
                    }
                }


                var variants = await taskGetVariants;

                var variantsToDelete = variants.Where(x => !input.Variants.Select(y => y.Name).Contains(x.Name));

                foreach (var item in variantsToDelete)
                {
                    await _productVariantRepository.RemoveAsync(item);
                }

                variants = await _productVariantRepository.GetByProduct(new() { Id = input.ProductId });

                return(OperationResultEnumerable <ProductVariantDto> .Success(variants.Select(x => x.ConvertToDto())));
            }

            return(OperationResultEnumerable <ProductVariantDto> .Fail(validationResult));
        }
        public async Task <IActionResult> Update(UpdateProductVariantInput input)
        {
            var result = await _service.UpdateAsync(input);

            return(new OperationActionResult(result));
        }