public ErrorModel AddDishToMenu(AddDishModel model)
        {
            var errors = new ErrorModel();
            if (model == null)
            {
                errors.Messages.Add("Invalid data.");
                return errors;
            }

            var dish = model.DishToAdd;
            if (dish == null)
            {
                errors.Messages.Add("No dish found to add.");
                return errors;
            }

            var provider = DbContext.GetProviders().SingleOrDefault(p => p.ProviderId == model.ProviderId);
            if (provider == null || provider.ProviderStatus != ProviderStatus.Verified)
            {
                errors.Messages.Add("Cannot add dish for any address not verified provider.");
                return errors;
            }

            var newDish = dish.ToEntity();
            newDish.ProviderId = model.ProviderId;
            newDish.Available = true;

            try
            {
                DbContext.SaveDishes(new List<DishEntity>{newDish});
                return errors;
            }
            catch (Exception ex)
            {
                errors.Messages.Add(ex.Message);
                return errors;
            }
        }
        public ErrorModel UpdateOrderItemStatus(UpdateOrderItemModel updateModel)
        {
            var errors = new ErrorModel();
            if (updateModel == null)
            {
                errors.Messages.Add("Invalid data. Please try again!");
                return errors;
            }

            try
            {
                DbContext.UpdateOrderItemStatus(updateModel.OrderId, updateModel.DishId, updateModel.ProviderId, updateModel.TargetStatus);
            }
            catch (Exception ex)
            {
                errors.Messages.Add(ex.Message);
            }
            return errors;
        }
        public ErrorModel RemoveDishFromMenu(RemoveDishModel removeModel)
        {
            var errors = new ErrorModel();

            if (removeModel == null)
            {
                errors.Messages.Add("Invalid data.");
                return errors;
            }
            var dishId = removeModel.DishId;
            var providerId = removeModel.ProviderId;

            try
            {
                DbContext.RemoveDish(dishId, providerId);
                return errors;
            }
            catch (Exception ex)
            {
                errors.Messages.Add(ex.Message);
                return errors;
            }
        }
        public ErrorModel PlaceOrder(PlaceOrderModel orderPlaceModel)
        {
            var errors = new ErrorModel();
            if (orderPlaceModel == null)
            {
                errors.Messages.Add("Invalid data.");
                return errors;
            }
            var orderItems = orderPlaceModel.OrderItems;
            var userId = orderPlaceModel.UserId;

            if (orderItems == null || orderItems.Count == 0)
            {
                errors.Messages.Add("No items found to order");
                return errors;
            }
            var dishPrices = DbContext.GetDishes().Where(d => orderItems.Any(item => item.DishId == d.DishId && item.Quantity > 0)).ToDictionary(d => d.DishId, d => d.Price);
            var newOrder = new OrderEntity { OrderDate = DateTime.Now, UserId = userId, SubTotal = orderItems.Where(item => item.Quantity > 0).Sum(item => item.Quantity * dishPrices[item.DishId]) };

            try
            {
                DbContext.SaveOrder(newOrder, orderItems.Select(item => item.ToEntity()).ToList());
                return errors;
            }
            catch(Exception ex)
            {
                errors.Messages.Add(ex.Message);
                return errors;
            }
        }