private void CreateCategoryTree(List <List <ZlItem> > breadcrumbs, ZlShortCategory category)
        {
            if (breadcrumbs.All(x => !x.Any()))
            {
                return;
            }

            category.Categories = breadcrumbs
                                  .GroupBy(el => el.FirstOrDefault())
                                  .Where(el => el.Key != null)
                                  .Select(el => new ZlShortCategory {
                UrlKey  = el.Key.UrlKey,
                FullUrl = el.Key.FullUrl,
                Label   = el.Key.Label
            })
                                  .ToList();

            foreach (var cat in category.Categories)
            {
                var partOfBreadcrumbs = breadcrumbs
                                        .Where(el => {
                    var firstElem = el.FirstOrDefault();
                    return(firstElem != null && string.Equals(firstElem.UrlKey, cat.UrlKey));
                }).Select(el => el.Skip(1).ToList())
                                        .ToList();
                CreateCategoryTree(partOfBreadcrumbs, cat);
            }
        }
        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));
            }
        }
        public async Task <IEnumerable <ZlShortCategory> > GetCategoryTree(string plZalandoUrl)
        {
            if (string.IsNullOrEmpty(plZalandoUrl))
            {
                throw new ArgumentNullException(nameof(plZalandoUrl));
            }

            var breadcrumbs = new List <List <ZlItem> >();

            var downloadFirstLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories=katalog", 0);

            var firstLevel = downloadFirstLevel.Item2;

            breadcrumbs.AddRange(downloadFirstLevel.Item1);

            var secondLevel = new List <ZlCategory>();

            foreach (var cat in firstLevel)
            {
                try
                {
                    var downloadSecondLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 0);

                    breadcrumbs.AddRange(downloadSecondLevel.Item1);
                    secondLevel.AddRange(downloadSecondLevel.Item2);
                    Thread.Sleep(500);
                }
                catch
                {
                    var downloadSecondLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 0);

                    breadcrumbs.AddRange(downloadSecondLevel.Item1);
                    secondLevel.AddRange(downloadSecondLevel.Item2);
                    Thread.Sleep(500);
                }
            }


            var thirdLevel = new List <ZlCategory>();

            foreach (var cat in secondLevel)
            {
                try
                {
                    var downloadThirdLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 1);

                    breadcrumbs.AddRange(downloadThirdLevel.Item1);
                    thirdLevel.AddRange(downloadThirdLevel.Item2);
                    Thread.Sleep(500);
                }
                catch
                {
                    var downloadThirdLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 1);

                    breadcrumbs.AddRange(downloadThirdLevel.Item1);
                    thirdLevel.AddRange(downloadThirdLevel.Item2);
                    Thread.Sleep(500);
                }
            }

            var fourthLevel = new List <ZlCategory>();

            foreach (var cat in thirdLevel)
            {
                try
                {
                    var downloadFourthLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 2);

                    breadcrumbs.AddRange(downloadFourthLevel.Item1);
                    fourthLevel.AddRange(downloadFourthLevel.Item2);
                    Thread.Sleep(500);
                }
                catch
                {
                    var downloadFourthLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 2);

                    breadcrumbs.AddRange(downloadFourthLevel.Item1);
                    fourthLevel.AddRange(downloadFourthLevel.Item2);
                    Thread.Sleep(500);
                }
            }

            Thread.Sleep(5000);

            var fiveLevel = new List <ZlCategory>();

            foreach (var cat in fourthLevel)
            {
                try
                {
                    var downloadFiveLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 3);

                    breadcrumbs.AddRange(downloadFiveLevel.Item1);
                    fiveLevel.AddRange(downloadFiveLevel.Item2);
                    Thread.Sleep(500);
                }
                catch
                {
                    var downloadFiveLevel = await DownloadCategoryLevel($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}", 3);

                    breadcrumbs.AddRange(downloadFiveLevel.Item1);
                    fiveLevel.AddRange(downloadFiveLevel.Item2);
                    Thread.Sleep(500);
                }
            }

            Thread.Sleep(5000);

            foreach (var cat in fiveLevel)
            {
                try
                {
                    breadcrumbs.AddRange(await DownloadBreadcrumbs($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}"));
                    Thread.Sleep(500);
                }
                catch
                {
                    breadcrumbs.AddRange(await DownloadBreadcrumbs($"{plZalandoUrl}/api/catalog/articles?categories={cat.UrlKey}"));
                    Thread.Sleep(500);
                }
            }

            var category = new ZlShortCategory();

            CreateCategoryTree(breadcrumbs, category);

            return(category.Categories);
        }