/// <summary>
 ///     Checks if the period is valid
 /// </summary>
 /// <param name="period"></param>
 /// <returns></returns>
 protected bool IsPeriodValid(PeriodOfDay period)
 {
     return Restaurant.Menu.Dishes.Any(n => n.PeriodOfDay == period);
 }
 /// <summary>
 ///     Validate the input for periodofday
 /// </summary>
 /// <param name="periodOfDay"></param>
 /// <returns></returns>
 private string ValidatePeriodOfDay(PeriodOfDay? periodOfDay)
 {
     if (periodOfDay.HasValue && IsPeriodValid(periodOfDay.Value)) return null;
     var validPeriods = GetValidPeriodOfDays();
     var validPeriodsString = GetStringOfPeriodsOfDay(validPeriods);
     return $"Invalid period. Valid periods are: {validPeriodsString}";
 }
 /// <summary>
 ///     Creates a menu item
 /// </summary>
 /// <param name="name">Dish name to be used</param>
 /// <param name="period">Period where the dish will be avaiable</param>
 /// <param name="dishType">Type of the dish</param>
 /// <param name="maxCount">Max number of items on a order</param>
 /// <returns></returns>
 private static MenuItem CreateMenuItem(string name, PeriodOfDay period, DishType dishType = DishType.Entree, int maxCount = 1)
 {
     return new MenuItem {Dish = new Dish {Name = name }, PeriodOfDay = period , DishType = dishType, MaxOrder = maxCount};
 }
 /// <summary>
 ///     Validate the max order number of an item
 /// </summary>
 /// <param name="item"></param>
 /// <param name="periodOfDay"></param>
 /// <param name="quantity"></param>
 /// <returns></returns>
 private string ValidateItemMaxOrder(string item, PeriodOfDay periodOfDay, int quantity)
 {
     var errorMessage = string.Empty;
     var menuItem = GetMenuItemFromDishTypeString(item, periodOfDay);
     if (menuItem.MaxOrder < quantity)
     {
         errorMessage = $"You cannot order more than {menuItem.MaxOrder} {menuItem.Dish.Name}";
     }
     return errorMessage;
 }
 /// <summary>
 ///     Validates if an item is available in that period
 /// </summary>
 /// <param name="dishType"></param>
 /// <param name="period"></param>
 /// <returns></returns>
 private string ValidateItemAvailability(DishType dishType, PeriodOfDay period)
 {
     var errorMessage = string.Empty;
     var isAnInvalidItem = _avaiableDishes.Count(n => n.DishType == dishType && n.PeriodOfDay == period) == 0;
     if (isAnInvalidItem)
     {
         errorMessage = $"{dishType} is not available in this period";
     }
     return errorMessage;
 }
 /// <summary>
 ///     Validate an item
 /// </summary>
 /// <param name="item"></param>
 /// <param name="periodOfDay"></param>
 /// <param name="quantity"></param>
 /// <returns></returns>
 private string ValidateItem(string item, PeriodOfDay periodOfDay, int quantity)
 {
     var errorMessage = ValidateDishType(item);
     if (!string.IsNullOrEmpty(errorMessage)) return errorMessage;
     var dishType = GetDishTypeFromString(item);
     errorMessage = ValidateItemAvailability(dishType.Value, periodOfDay);
     if (!string.IsNullOrEmpty(errorMessage)) return errorMessage;
     errorMessage = ValidateItemMaxOrder(item, periodOfDay, quantity);
     return errorMessage;
 }
 /// <summary>
 ///     Gets a menu item from the string inputs
 /// </summary>
 /// <param name="item"></param>
 /// <param name="periodOfDay"></param>
 /// <returns></returns>
 private MenuItem GetMenuItemFromDishTypeString(string item, PeriodOfDay periodOfDay)
 {
     return Restaurant.Menu.Dishes.Single(
         n => Convert.ToInt32(n.DishType) == Convert.ToInt32(item) && n.PeriodOfDay == periodOfDay);
 }
        /// <summary>
        ///     Gets an error message for invalid items
        /// </summary>
        /// <param name="invalidItems"></param>
        /// <param name="validItems"></param>
        /// <param name="periodOfDay"></param>
        /// <returns></returns>
        private string GetInvalidItemsMessage(Dictionary<string, string> invalidItems, List<string> validItems,
            PeriodOfDay periodOfDay)
        {
            var orderstring = "I'm sorry";

            if (validItems.Count > 0)
            {
                orderstring += ", I could understand that you want: ";
                for (var index = 0; index < validItems.Count; index++)
                {
                    var validItem = validItems[index];
                    var menuItem = GetMenuItemFromDishTypeString(validItem, periodOfDay);
                    if (index > 0)
                    {
                        orderstring += ", ";
                    }
                    orderstring += $"{menuItem.Dish.Name} as {menuItem.DishType}";
                }
            }
            orderstring += ". But I had these problems: ";
            for (var index = 0; index < invalidItems.Keys.Count; index++)
            {
                var invalidItemKey = invalidItems.Keys.ElementAt(index);
                if (index > 0)
                {
                    orderstring += ", ";
                }
                orderstring += invalidItems[invalidItemKey];
            }

            return orderstring;
        }