private async Task CreateCategoryNamesMapping(ZlShortCategory categories,
                                                      CategoryNamesMapping categoryNamesMapping)
        {
            if (categories.Categories is null)
            {
                return;
            }

            if (categoryNamesMapping.CategoryNamesMappings is null)
            {
                categoryNamesMapping.CategoryNamesMappings = new List <CategoryNamesMapping>();
            }

            var symbolsRegex               = new Regex("[^A-Za-z-а-яА-Яіїє.,_/0-9%$&*()+=`~@!# \t\n]");
            var notSlugAlphabet            = new Regex("[^a-zA-Z0-9\\s\\-]");
            var spaceRegex                 = new Regex("\\s");
            var enRegex                    = new Regex("[^A-Za-z\\s]");
            var spaceCharacterAtStartOrEnd = new Regex("^\\s*|\\s*$");

            foreach (var cl in categories.Categories)
            {
                var cnm = new CategoryNamesMapping();
                cnm.Name = symbolsRegex.Replace(await _googleTranslationService.TranslateTextAsync(cl.Label, "uk", "pl"), "");
                cnm.Slug = spaceRegex
                           .Replace(spaceCharacterAtStartOrEnd
                                    .Replace(notSlugAlphabet
                                             .Replace(_transliterationService.TransliterateUaToEnUtf(cnm.Name), ""), ""), "-")
                           .ToLower();
                cnm.PlSlug = cl.UrlKey;
                cnm.PlName = cl.Label;
                categoryNamesMapping.CategoryNamesMappings.Add(cnm);
            }

            for (int i = 0; i < categories.Categories.Count(); i++)
            {
                await CreateCategoryNamesMapping(categories.Categories.ElementAt(i), categoryNamesMapping.CategoryNamesMappings.ElementAt(i));
            }
        }
        private async Task <(ProductRequest, List <ProductVariationRequest>)> CreateProductToInsert(Dictionary <ArticleInfo, ArticleInfo> articlesDict,
                                                                                                    IEnumerable <string> allowedAttributeCategories, IEnumerable <string> invalidAttributeNames, IEnumerable <IEnumerable <Product> > scrapyProducts,
                                                                                                    decimal zlotyRate, decimal markUp, string plZalandoUrl, int sizeAttributeId, int brandAttributeId)
        {
            try {
                var articlePair = articlesDict.First();

                var status = articlePair.Value == null ? "pending" : "publish";

                var isVariableProduct = articlesDict.Count() > 1 || articlePair.Key.Units.Count() > 1;

                var sku = isVariableProduct ? articlePair.Key.ModelId : articlePair.Key.Id;

                string name;
                if (articlePair.Value?.Name != null)
                {
                    name = await _googleTranslationService.TranslateTextAsync(articlePair.Value?.Name, "uk", "en");
                }
                else if (articlePair.Key?.Name != null)
                {
                    name = await _googleTranslationService.TranslateTextAsync(articlePair.Key?.Name, "uk", "pl");
                }
                else
                {
                    throw new ArgumentNullException(nameof(name));
                }

                var notSlugAlphabet            = new Regex("[^a-zA-Z0-9\\s]");
                var spaceCharacter             = new Regex("\\s");
                var spaceCharacterAtStartOrEnd = new Regex("^\\s*|\\s*$");

                var slug = (spaceCharacter
                            .Replace(spaceCharacterAtStartOrEnd
                                     .Replace(notSlugAlphabet
                                              .Replace(_transliteratioinService.TransliterateUaToEnUtf(name), ""), ""), "-") + "-" + sku)
                           .ToLower();
                if (string.IsNullOrEmpty(slug))
                {
                    throw new ArgumentNullException(nameof(slug));
                }

                var type = isVariableProduct ? "variable" : "simple";

                var categories = scrapyProducts
                                 .SelectMany(el => el.ToList())
                                 .FirstOrDefault(el => isVariableProduct ? string.Equals(el.ModelSku, sku) : string.Equals(el.Sku, sku))
                                 .ProductCategories
                                 .Select(el => new ProductCategoryRequest {
                    Id = el.Category.WoocommerceId
                })
                                 .Distinct()
                                 .ToList();

                string description;
                if (articlePair.Value == null)
                {
                    description = string.Join(Environment.NewLine, articlePair.Key.Attributes
                                              .Where(el => allowedAttributeCategories.Contains(el.Category))
                                              .Where(el => !el.Data.Any(x => invalidAttributeNames.Contains(x.Name)))
                                              .SelectMany(el => el.Data.Select(x => x.Title)));
                }
                else
                {
                    var descriptionList = articlePair.Value.Attributes
                                          .Where(el => allowedAttributeCategories.Contains(el.Category))
                                          .Where(el => !el.Data.Any(x => invalidAttributeNames.Contains(x.Name)))
                                          .SelectMany(el => el.Data.Select(x => (string)(x.Name + ": " + Convert.ToString(x.Values))))
                                          .Select(el => _googleTranslationService.TranslateTextAsync(el, "uk", "en"));

                    var translatedDescription = await Task.WhenAll(descriptionList);

                    description = string.Join(Environment.NewLine, translatedDescription);
                }

                var images = articlePair.Key.Media.Images
                             .Select(el => new ProductImageRequest
                {
                    Src = el.Sources.Color
                          .Split("?")
                          .FirstOrDefault(),
                    Name = "",
                    Alt  = ""
                });
                var validImages = new List <ProductImageRequest>();
                foreach (var img in images)
                {
                    try
                    {
                        using (var client = new HttpClient())
                        {
                            var response = await client.GetAsync(img.Src);

                            if (response.StatusCode == System.Net.HttpStatusCode.OK)
                            {
                                validImages.Add(img);
                            }
                        }
                    }
                    catch { }
                }

                var popularity = (int)Math.Ceiling(scrapyProducts
                                                   .SelectMany(el => el.ToList())
                                                   .FirstOrDefault(el => isVariableProduct ? string.Equals(el.ModelSku, sku) : string.Equals(el.Sku, sku))
                                                   .ProductCategories
                                                   .Average(el => el.CategoryIndex));

                var popularityStr       = popularity.ToString();
                var popularityStrLength = popularityStr.Length;
                for (int i = 0; i < 9 - popularityStrLength; i++)
                {
                    popularityStr = "0" + popularityStr;
                }


                if (!isVariableProduct)
                {
                    var unit = articlePair.Key.Units.First();

                    var price = decimal.Parse(unit.DisplayPrice.OriginalPrice.Value) * (1 + markUp) * zlotyRate;

                    var productToInsert = new ProductRequest
                    {
                        Name              = name,
                        Slug              = slug,
                        Sku               = sku,
                        Type              = type,
                        Status            = status,
                        Description       = description,
                        CatalogVisibility = "visible",
                        RegularPrice      = price.ToString(),
                        Categories        = categories,
                        Images            = new List <ProductImageRequest>(),
                        ManageStock       = true,
                        StockQuantity     = unit.Stock,
                        StockStatus       = unit.Stock > 0 ? "instock" : "outofstock",
                        Attributes        = new List <ProductAttributeRequest> {
                            new ProductAttributeRequest
                            {
                                Name    = "color",
                                Options = new List <string> {
                                    articlePair.Key.Color
                                },
                                Variation = false,
                                Visible   = true
                            },
                            new ProductAttributeRequest
                            {
                                Id      = sizeAttributeId,
                                Options = new List <string> {
                                    unit.Size.Local
                                },
                                Variation = false,
                                Visible   = true
                            },
                            new ProductAttributeRequest
                            {
                                Id      = brandAttributeId,
                                Options = new List <string> {
                                    articlePair.Key.Brand.Name
                                },
                                Variation = false,
                                Visible   = true
                            }
                        },
                        MetaData = new List <ProductMetaDataRequest>
                        {
                            new ProductMetaDataRequest
                            {
                                Key   = "zalando_url",
                                Value = $"{plZalandoUrl}/katalog?q={sku}"
                            },
                            new ProductMetaDataRequest
                            {
                                Key   = "original_price",
                                Value = price.ToString()
                            },
                            new ProductMetaDataRequest
                            {
                                Key   = "delivery_time",
                                Value = articlePair.Key.DeliveryTime
                            },
                            new ProductMetaDataRequest
                            {
                                Key   = "pl_name",
                                Value = articlePair.Key.Name
                            },
                            new ProductMetaDataRequest
                            {
                                Key   = "popularity",
                                Value = popularityStr
                            },
                            new ProductMetaDataRequest
                            {
                                Key   = "fifu_list_url",
                                Value = string.Join('|', validImages.Select(el => el.Src))
                            }
                        }
                    };

                    return(productToInsert, null);
                }

                var productRequest = new ProductRequest
                {
                    Name              = name,
                    Slug              = slug,
                    Sku               = sku,
                    Type              = type,
                    Status            = status,
                    Description       = description,
                    CatalogVisibility = "visible",
                    Categories        = categories,
                    Images            = new List <ProductImageRequest>(),
                    MetaData          = new List <ProductMetaDataRequest>
                    {
                        new ProductMetaDataRequest
                        {
                            Key   = "pl_name",
                            Value = articlePair.Key.Name
                        },
                        new ProductMetaDataRequest
                        {
                            Key   = "popularity",
                            Value = popularityStr
                        },
                        new ProductMetaDataRequest
                        {
                            Key   = "fifu_list_url",
                            Value = string.Join('|', validImages)
                        }
                    },
                    Attributes = new List <ProductAttributeRequest> {
                        new ProductAttributeRequest {
                            Name    = "color",
                            Options = articlesDict
                                      .Select(el => el.Key.Color)
                                      .ToList(),
                            Variation = true,
                            Visible   = true
                        },
                        new ProductAttributeRequest
                        {
                            Id        = sizeAttributeId,
                            Variation = true,
                            Visible   = true,
                            Options   = articlesDict.Keys
                                        .SelectMany(el => el.Units)
                                        .Select(el => el.Size.Local)
                                        .Distinct()
                                        .ToList()
                        },
                        new ProductAttributeRequest
                        {
                            Id        = brandAttributeId,
                            Variation = false,
                            Visible   = true,
                            Options   = new List <string> {
                                articlePair.Key.Brand.Name
                            }
                        }
                    },
                    DefaultAttributes = new List <ProductDefaultAttributeRequest>
                    {
                        new ProductDefaultAttributeRequest
                        {
                            Name   = "color",
                            Option = articlePair.Key.Color
                        },
                        new ProductDefaultAttributeRequest
                        {
                            Id     = sizeAttributeId,
                            Option = articlePair.Key.Units
                                     .FirstOrDefault()
                                     .Size
                                     .Local
                        }
                    }
                };

                var productVariationsRequest = new List <ProductVariationRequest>();
                foreach (var pair in articlesDict)
                {
                    foreach (var unit in pair.Key.Units)
                    {
                        var variationImage = "";
                        foreach (var image in pair.Key.Media.Images)
                        {
                            try
                            {
                                var link = image.Sources.Color.Split("?").FirstOrDefault();
                                using (var client = new HttpClient())
                                {
                                    var response = await client.GetAsync(link);

                                    if (response.StatusCode == System.Net.HttpStatusCode.OK)
                                    {
                                        variationImage = link;
                                        break;
                                    }
                                }
                            }
                            catch { }
                        }

                        productVariationsRequest.Add(new ProductVariationRequest
                        {
                            Sku           = unit.Id,
                            RegularPrice  = (decimal.Parse(unit.OriginalPrice.Value) * (markUp + 1) * zlotyRate).ToString(),
                            Status        = status,
                            ManageStock   = true,
                            StockQuantity = unit.Stock,
                            StockStatus   = unit.Stock > 0 ? "instock" : "outofstock",
                            Image         = new ProductVariationImageRequest(),
                            Attributes    = new List <ProductVariationAttributesRequest>
                            {
                                new ProductVariationAttributesRequest
                                {
                                    Name   = "color",
                                    Option = pair.Key.Color
                                },
                                new ProductVariationAttributesRequest
                                {
                                    Id     = sizeAttributeId,
                                    Option = unit.Size.Local
                                }
                            },
                            MetaData = new List <ProductVariationMetaDateRequest>
                            {
                                new ProductVariationMetaDateRequest
                                {
                                    Key   = "zalando_url",
                                    Value = $"{plZalandoUrl}/katalog?q={pair.Key.Id}"
                                },
                                new ProductVariationMetaDateRequest
                                {
                                    Key   = "original_price",
                                    Value = unit.OriginalPrice.Value
                                },
                                new ProductVariationMetaDateRequest
                                {
                                    Key   = "delivery_time",
                                    Value = articlePair.Key.DeliveryTime
                                },
                                new ProductVariationMetaDateRequest
                                {
                                    Key   = "fifu_list_url",
                                    Value = variationImage
                                }
                            }
                        });
                    }
                }

                return(productRequest, productVariationsRequest);
            }
            catch (Exception e)
            {
                Console.WriteLine($"impossible to create product: exeption = {e.ToString()}");
            }
            return(null, null);
        }