/// <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; }