public static async Task <List <KeyVariantAttributes> > GetKeyVariantAttributes(Product product, Variant variant, CultureInfo culture, IOvertureClient client)
        {
            if (variant == null)
            {
                return(null);
            }

            var request = new GetProductDefinitionRequest()
            {
                CultureName = culture.Name,
                Name        = product.DefinitionName,
            };

            var productDef = client.Send(request);

            var lookups = await GetLookups(productDef, client).ConfigureAwait(false);

            if (variant.PropertyBag == null)
            {
                return(null);
            }

            var keyVariantAttributes = productDef.VariantProperties.Where(x => x.IsKeyVariant)
                                       .OrderBy(x => x.KeyVariantOrder)
                                       .ToList();

            if (!keyVariantAttributes.Any())
            {
                return(null);
            }

            var list = new List <KeyVariantAttributes>();

            foreach (var keyVariantAttribute in keyVariantAttributes)
            {
                object kvaValue;
                if (keyVariantAttribute.DataType.Equals(PropertyDataType.Lookup))
                {
                    var lookup =
                        lookups.SingleOrDefault(l => l.LookupName == keyVariantAttribute.LookupDefinition.LookupName);
                    kvaValue = GetLocalizedKvaDisplayValueFromLookup(lookup, culture.Name, variant, keyVariantAttribute);
                }
                else
                {
                    kvaValue = GetLocalizedKvaDisplayValueFromValue(culture.Name, variant, keyVariantAttribute);
                }

                if (kvaValue != null)
                {
                    list.Add(new KeyVariantAttributes()
                    {
                        Key           = keyVariantAttribute.PropertyName,
                        Value         = kvaValue.ToString(),
                        OriginalValue = variant.PropertyBag[keyVariantAttribute.PropertyName].ToString()
                    });
                }
            }

            return(list);
        }
        public virtual async Task <ProductDefinition> GetProductDefinitionAsync(GetProductDefinitionParam param)
        {
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }

            var productDefinitionCacheKey = new CacheKey(CacheConfigurationCategoryNames.ProductDefinition);

            productDefinitionCacheKey.AppendKeyParts(param.Name);

            var result = await CacheProvider.GetOrAddAsync(productDefinitionCacheKey, () =>
            {
                var request = new GetProductDefinitionRequest
                {
                    Name        = param.Name,
                    CultureName = param.CultureInfo.Name
                };

                return(OvertureClient.SendAsync(request));
            }).ConfigureAwait(false);

            return(result);
        }