// GET: Pantry/Edit/5
        public async Task <ActionResult> Edit(int id)
        {
            var food = await _context.Foods.Include(f => f.Category).Include(qu => qu.QuantityUnit)
                       .FirstOrDefaultAsync(f => f.Id == id);

            var categories = await _context.Categories.Select(c => new SelectListItem()
            {
                Text  = c.Name,
                Value = c.Id.ToString()
            }).ToListAsync();

            var quantityUnits = await _context.QuantityUnits.Select(qu => new SelectListItem()
            {
                Text  = qu.Name,
                Value = qu.Id.ToString()
            }).ToListAsync();

            var viewModel = new FoodItemFormViewModel()
            {
                FoodItemName        = food.Name,
                Quantity            = food.Quantity,
                CategoryOptions     = categories,
                QuantityUnitOptions = quantityUnits.OrderBy(qu => qu.Text).ToList(),
                QuantityUnitId      = food.QuantityUnitId.Value,
                Threshold           = food.Threshold,
                FoodId     = food.Id,
                PantryId   = food.PantryId.Value,
                CategoryId = food.CategoryId
            };

            return(View(viewModel));
        }
        public async Task <ActionResult> Create(FoodItemFormViewModel foodItem)
        {
            try
            {
                var user = await GetUserAsync();

                var pantryId = user.PantryId;

                var food = new Food()
                {
                    PantryId       = pantryId,
                    Name           = foodItem.FoodItemName,
                    CategoryId     = foodItem.CategoryId,
                    Quantity       = foodItem.Quantity,
                    QuantityUnitId = foodItem.QuantityUnitId,
                    Threshold      = foodItem.Threshold,
                    IsThreshold    = foodItem.IsThreshold
                };
                _context.Foods.Add(food);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            catch (Exception ex)
            {
                return(View());
            }
        }
        // GET: Pantry/Details/5
        public async Task <ActionResult> Details(int id)
        {
            var viewModel = new FoodItemFormViewModel();
            var food      = await _context.Foods.Include(f => f.Category).Include(u => u.QuantityUnit)
                            .FirstOrDefaultAsync(f => f.Id == id);

            var user = await GetUserAsync();

            viewModel.FoodId       = food.Id;
            viewModel.Category     = food.Category;
            viewModel.QuantityUnit = food.QuantityUnit;
            viewModel.FoodItemName = food.Name;
            viewModel.PantryId     = food.PantryId.Value;
            viewModel.Quantity     = food.Quantity;
            viewModel.Threshold    = food.Threshold;
            return(View(viewModel));
        }
        // GET: GroceryList/Create
        public async Task <ActionResult> Create()
        {
            var viewModel = new FoodItemFormViewModel();

            var categories = await _context.Categories.Select(c => new SelectListItem()
            {
                Text  = c.Name,
                Value = c.Id.ToString()
            }).ToListAsync();

            var quantityUnits = await _context.QuantityUnits.Select(qu => new SelectListItem()
            {
                Text  = qu.Name,
                Value = qu.Id.ToString()
            }).ToListAsync();

            viewModel.CategoryOptions     = categories;
            viewModel.QuantityUnitOptions = quantityUnits.OrderBy(qu => qu.Text).ToList();

            return(View(viewModel));
        }
        public async Task <ActionResult> Edit(int id, FoodItemFormViewModel foodItem)
        {
            try
            {
                var food = await _context.Foods.Include(f => f.Category).Include(qu => qu.QuantityUnit)
                           .FirstOrDefaultAsync(f => f.Id == id);

                food.Name           = foodItem.FoodItemName;
                food.Quantity       = foodItem.Quantity;
                food.QuantityUnitId = foodItem.QuantityUnitId;
                food.Threshold      = foodItem.Threshold;
                food.CategoryId     = foodItem.CategoryId;

                _context.Foods.Update(food);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            catch
            {
                return(View());
            }
        }
        public async Task <ActionResult> Create(FoodItemFormViewModel foodItem)
        {
            try
            {
                var user = await GetUserAsync();

                var pantryId    = user.PantryId;
                var groceryList = await _context.GroceryLists
                                  .FirstOrDefaultAsync(gl => gl.PantryId == user.PantryId);

                var foodMatch = await _context.Foods
                                .FirstOrDefaultAsync(f => f.Name.Contains(foodItem.FoodItemName));

                if (foodMatch == null)
                {
                    var food = new Food()
                    {
                        PantryId       = pantryId,
                        Name           = foodItem.FoodItemName,
                        CategoryId     = foodItem.CategoryId,
                        Quantity       = 0,
                        QuantityUnitId = foodItem.QuantityUnitId,
                        Threshold      = foodItem.Threshold,
                        IsThreshold    = foodItem.IsThreshold
                    };
                    _context.Foods.Add(food);
                    await _context.SaveChangesAsync();

                    var groceryListFoodItem = new GroceryListFood()
                    {
                        FoodId        = food.Id,
                        Quantity      = foodItem.Quantity,
                        GroceryListId = groceryList.Id
                    };
                    _context.GroceryListFoods.Add(groceryListFoodItem);
                    await _context.SaveChangesAsync();

                    return(RedirectToAction(nameof(Index)));
                }
                else
                {
                    var categories = await _context.Categories.Select(c => new SelectListItem()
                    {
                        Text  = c.Name,
                        Value = c.Id.ToString()
                    }).ToListAsync();

                    var quantityUnits = await _context.QuantityUnits.Select(qu => new SelectListItem()
                    {
                        Text  = qu.Name,
                        Value = qu.Id.ToString()
                    }).ToListAsync();

                    foodItem.QuantityUnitOptions = quantityUnits.OrderBy(qu => qu.Text).ToList();
                    foodItem.CategoryOptions     = categories;
                    foodItem.ShowDialog          = true;
                    return(View(foodItem));
                }
            }
            catch (Exception ex)
            {
                return(View());
            }
        }