//-- Create
        public bool Create(CocktailCreate model)
        {
            var entity =
                new CustomCocktail()
            {
                User        = _user,
                Name        = model.Name,
                Ingredients = model.Ingredients
            };

            int numOfChanges = 1;

            List <CustomSpecific> customSpecifics = ConvertFromStringToCustomSpecific(model, entity);

            foreach (CustomSpecific i in customSpecifics)
            {
                _context.CustomSpecifics.Add(i);
            }

            numOfChanges += customSpecifics.Count();

            entity.LiquorsInCocktail = customSpecifics;

            _context.CustomCocktails.Add(entity);
            return(_context.SaveChanges() == numOfChanges);
        }
        //-- Update
        public bool Update(int id, CocktailCreate updatedCustomCocktail)
        {
            CustomCocktail customCocktail = _context.CustomCocktails.Find(id);

            int numOfChanges = 0;

            if (!(customCocktail.Name == updatedCustomCocktail.Name && customCocktail.Ingredients == updatedCustomCocktail.Ingredients))
            {
                numOfChanges = 1;
            }

            customCocktail.Name        = updatedCustomCocktail.Name;
            customCocktail.Ingredients = updatedCustomCocktail.Ingredients;

            numOfChanges += RemoveCustomSpecific(id);

            List <CustomSpecific> customSpecifics = ConvertFromStringToCustomSpecific(updatedCustomCocktail, customCocktail);

            foreach (CustomSpecific i in customSpecifics)
            {
                _context.CustomSpecifics.Add(i);
            }

            numOfChanges += customSpecifics.Count();

            customCocktail.LiquorsInCocktail = customSpecifics;
            return(_context.SaveChanges() == numOfChanges);
        }
        //-- Get By Name
        public List <CocktailListItem> GetByName(string name)
        {
            List <CocktailListItem> customCocktails = _context.CustomCocktails.Where(e => e.Name.ToLower() == name.ToLower() && e.UserId == _user.Id).Select(e => new CocktailListItem
            {
                Id   = e.Id,
                Name = e.Name,
            }).ToList();

            if (customCocktails.Count == 0)
            {
                return(null);
            }

            foreach (CocktailListItem item in customCocktails)
            {
                CustomCocktail customCocktail = _context.CustomCocktails.Find(item.Id);
                item.LiquorsInCocktail = ConvertFromCustomSpecificToString(customCocktail.LiquorsInCocktail);
                item.Ingredients       = customCocktail.Ingredients.Split(_separator, StringSplitOptions.RemoveEmptyEntries).ToList();
            }

            return(customCocktails);
        }
        //-- Get By ID
        public CocktailListItem GetById(int id)
        {
            CustomCocktail customCocktail = _context.CustomCocktails.Find(id);

            if (customCocktail is null)
            {
                return(null);
            }

            if (customCocktail.UserId != _user.Id)
            {
                return(null);
            }

            return(new CocktailListItem
            {
                Id = customCocktail.Id,
                Name = customCocktail.Name,
                LiquorsInCocktail = ConvertFromCustomSpecificToString(customCocktail.LiquorsInCocktail),
                Ingredients = customCocktail.Ingredients.Split(_separator, StringSplitOptions.RemoveEmptyEntries).ToList()
            });
        }
        // helper
        public bool ChangesWereNotMade(int id, CocktailCreate updatedCustomCocktail)
        {
            CustomCocktail customCocktail = _context.CustomCocktails.Find(id);

            return(updatedCustomCocktail.Name == customCocktail.Name && string.Join(",", ConvertFromCustomSpecificToString(customCocktail.LiquorsInCocktail).ToList()) == string.Join(",", updatedCustomCocktail.LiquorsInCocktail.Split(_separator, StringSplitOptions.RemoveEmptyEntries).ToList()) && updatedCustomCocktail.Ingredients.ToLower() == customCocktail.Ingredients.ToLower());
        }
        // helper
        public List <CustomSpecific> ConvertFromStringToCustomSpecific(CocktailCreate cocktailCreate, CustomCocktail customCocktail)
        {
            List <CustomSpecific> customSpecifics = new List <CustomSpecific>();
            List <string>         liquors         = cocktailCreate.LiquorsInCocktail.Split(_separator, StringSplitOptions.RemoveEmptyEntries).ToList();

            foreach (string name in liquors)
            {
                var liquorQuery =
                    _context
                    .Liquors
                    .SingleOrDefault(e => e.Type == name && e.Subtype == null || e.Subtype == name);

                var specificLiquorQuery =
                    _context
                    .SpecificLiquors
                    .SingleOrDefault(e => e.Name == name);

                CustomSpecific junction = new CustomSpecific()
                {
                    CustomCocktail = customCocktail,
                    Liquor         = liquorQuery,
                    SpecificLiquor = specificLiquorQuery
                };

                customSpecifics.Add(junction);
            }
            return(customSpecifics);
        }