private static DictionaryData GetDefault(DictionaryData parent)
 {
     while (true)
     {
         if (parent.Variants.Any())
         {
             return(parent);
         }
         foreach (var variant in parent.SubVariants)
         {
             return(GetDefault(variant));
         }
     }
 }
        private static DictionaryData GetData(IReadOnlyList <string> bits, string name, int index, TileConfiguration tile, DictionaryData parent, string variantCode = null)
        {
            if (variantCode == null)
            {
                variantCode = bits[index];
            }

            variantCode = Regex.Replace(variantCode, name, "", RegexOptions.IgnoreCase);
            variantCode = Regex.Replace(variantCode, "_", "");

            if (!parent.Variants.ContainsKey(variantCode) && !parent.SubVariants.Any(x => x.SubVariantKey == variantCode) &&
                !parent.SubVariants.Any(x => x.Variants.ContainsKey(variantCode)))
            {
                parent.Variants.Add(variantCode, tile.Code);
                return(parent);
            }

            DictionaryData variant;

            if (!parent.SubVariants.Any(x => x.SubVariantKey == variantCode))
            {
                variant = new DictionaryData();
                variant.SubVariantKey = variantCode;

                if (parent.Variants.ContainsKey(variantCode))
                {
                    var vCode = parent.Variants[variantCode].Split('.').Last();

                    vCode = Regex.Replace(vCode, variantCode, "", RegexOptions.IgnoreCase);
                    vCode = Regex.Replace(vCode, "_", "");

                    variant.Variants.Add(vCode, parent.Variants[variantCode]);
                    parent.Variants.Remove(variantCode);
                }

                parent.SubVariants.Add(variant);
            }
            else
            {
                variant = parent.SubVariants.First(x => x.SubVariantKey == variantCode);
            }

            if (index + 1 <= bits.Count - 1)
            {
                GetData(bits, variantCode, index + 1, tile, variant);
            }

            return(parent);
        }