internal void ParseIngredients()
        {
            var parser = new IngredientsParser();
            List <IngredientsParser.ParsedAnnotation> annotations = new List <IngredientsParser.ParsedAnnotation>();
            var _parsedIngredients = parser.Parse(_currentProduct.DisplayIngredients, annotations);

            var translator         = new IngredientLanguageNames(_repo);
            var nutrientTranslator = new NutrientLanguageNames(_repo);
            var euNumbers          = new EUAdditiveLanguageNames(_repo);

            foreach (var parsedIngredient in _parsedIngredients.Ingredients)
            {
                Product.Ingredients.Add(new IngredientViewModel(parsedIngredient, Product));
            }
            var additives = DetectEUNumbers(_parsedIngredients.Ingredients, euNumbers).OrderBy(w => w.EUNumber);

            foreach (var additive in additives)
            {
                Product.EUAdditives.Add(new EUAdditiveViewModel(additive.EUNumber, additive.DisplayName));
            }
            var allergens = CollectAllergens(_parsedIngredients.Ingredients);

            foreach (var allergen in allergens)
            {
                Product.Allergens.Add(new AllergenViewModel(allergen.Name, allergen.DisplayName));
            }
            ProcessNutrients();
            Product.Translate();
        }
        private EUAdditiveViewModel DetectEUNumber(IngredientsParser.ParsedIngredient ingredient, EUAdditiveLanguageNames euNumbers)
        {
            var results = euNumbers.GetEUAdditiveNumber(ingredient.Name, Product.LanguageCode);

            if (results.Count() == 1)
            {
                return(new EUAdditiveViewModel(results.First().EUNumber, results.First().Name));
            }
            return(null);
        }
        private IEnumerable <EUAdditiveViewModel> DetectEUNumbers(IEnumerable <IngredientsParser.ParsedIngredient> ingredients, EUAdditiveLanguageNames euNumbers)
        {
            var detected = new List <EUAdditiveViewModel>();

            if (ingredients != null)
            {
                foreach (var ingredient in ingredients)
                {
                    var euNumber = DetectEUNumber(ingredient, euNumbers);
                    if (euNumber != null)
                    {
                        //Product.EUAdditives.Add(euNumber); // todo: one or the other - this is nice for live detection
                        detected.Add(euNumber);
                    }
                    detected.AddRange(DetectEUNumbers(ingredient.Ingredients, euNumbers));
                }
            }
            return(detected);
        }