public ActionResult Purchase(int row, int col)
        {
            StatusViewModel result = null;

            try
            {
                var item = _vm.PurchaseItem(row, col);
                result = new StatusViewModel(eStatus.Success, item.Category.Noise);
            }
            catch (Exception ex)
            {
                result = new StatusViewModel(eStatus.Error, ex.Message);
            }

            var jsonResult = Json(result);

            return(GetAuthenticatedJson(jsonResult, _vm.Role.IsCustomer || _vm.Role.IsServiceman || _vm.Role.IsExecutive));
        }
        private static void BuyItemByIndex(IVendingMachine machine, int index)
        {
            int    numberOfItemsThatCanBePurchased = machine.HowManyItemsCanBeBought(index);
            string nameOfItem = machine.GetCurrentCatalogue()[index].GetItemType().Name;

            if (numberOfItemsThatCanBePurchased == 0)
            {
                Console.WriteLine($"You don't have balance to purchase any {nameOfItem}! Please top up balance from Main Menu");
                GoBackToMainMenu(machine);
            }
            else
            {
                Console.WriteLine($"You can at most buy {numberOfItemsThatCanBePurchased} with your balance of ${machine.GetWalletBalance()}.");
                Console.WriteLine("How many do you want to buy?");
                string input = Console.ReadLine();

                if (IsResponseInteger(input))
                {
                    int responseInt = GetResponseInteger(input);
                    if (responseInt > 0 && responseInt <= numberOfItemsThatCanBePurchased)
                    {
                        List <IItem> items = machine.PurchaseItem(index, responseInt);
                        Console.WriteLine($"Congratulations! You purchased {responseInt} {nameOfItem}");
                        DisplayCurrentCatalogue(machine);
                        GoBackToMainMenu(machine);
                    }
                    else
                    {
                        Console.WriteLine("Wrong Input");
                        GoBackToMainMenu(machine);
                    }
                }
                else
                {
                    Console.WriteLine("Wrong Input");
                    GoBackToMainMenu(machine);
                }
            }
        }
        private void DisplayPurchaseMenu()
        {
            while (true)
            {
                PrintTitle();

                Console.WriteLine(" (1) Insert money");
                Console.WriteLine(" (2) Make a selection");
                Console.WriteLine(" (3) Finish Transaction");
                Console.WriteLine(" (R) Return to Main Menu");
                Console.WriteLine();
                Console.WriteLine($" Current balance: {_vm.RunningTotal.ToString("C")}");
                Console.Write(" Please make a choice: ");;

                string choice = Console.ReadLine().ToLower();

                Console.WriteLine();

                if (choice == Option_InsertMoney)
                {
                    Console.Write(" How much money do you want to enter? ($1, $2, $5, $10): ");
                    int moneyIn = int.Parse(Console.ReadLine());

                    _vm.FeedMoney(moneyIn);
                }
                else if (choice == Option_MakeSelection)
                {
                    PrintTitle();

                    Console.WriteLine($" Current balance: {_vm.RunningTotal.ToString("C")}");
                    DisplayInventory();

                    Console.WriteLine();

                    Console.Write(" Please select a slot id: ");
                    string slot = Console.ReadLine().ToUpper();

                    Console.WriteLine();

                    try
                    {
                        int col           = int.Parse(slot[0].ToString());
                        int row           = int.Parse(slot[1].ToString());
                        var purchasedItem = _vm.PurchaseItem(row, col);
                        Console.WriteLine(" Here are your " + purchasedItem.Product.Name);
                        Console.WriteLine(" " + purchasedItem.Category.Noise);
                    }
                    catch (InvalidProductSelection)
                    {
                        Console.WriteLine("Invalid slot id");
                    }
                    catch (InsufficientFundsException)
                    {
                        Console.WriteLine("Insufficient funds");
                    }
                    catch (SoldOutException)
                    {
                        Console.WriteLine("Product is sold out");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        Console.WriteLine();
                        Console.WriteLine(" Thank you for using Vendo-Matic!");
                        Console.ReadKey();
                    }
                }
                else if (choice == Option_ReturnChange)
                {
                    DisplayReturnedChange();
                    Console.ReadKey();
                }
                else if (choice == Option_ReturnToPreviousMenu)
                {
                    Console.WriteLine(" Returning to previous menu. ");
                    Console.ReadKey();
                    return;
                }
                else
                {
                    DisplayInvalidOption();
                }
            }
        }