public ActionResult Create(IFormCollection collection)
 {
     try
     {
         var newCustomer = new Domain.Models.Customer
         {
             FirstName       = collection["FirstName"],
             LastName        = collection["LastName"],
             MyStoreLocation = new Domain.Models.Location {
                 ID = Int32.Parse(collection["allLocations"])
             }
         };
         _repository.AddACustomer(newCustomer);
         return(View(Details(newCustomer.ID)));
     }
     catch
     {
         return(RedirectToAction(nameof(Index)));
     }
 }
        /// <summary>
        /// The main purpose of this function is to run a while loop until the user is done with all of their interactions.
        /// It has checks to make sure that input for a menu selection is valid as well as checks for input from the user in each selection menu option
        /// </summary>
        /// <param name="storeRepository"> This is the reference to the StoreRepository to call the functions to be handled by the db</param>
        public static void RunMenuSelection(IStoreRepository storeRepository)
        {
            // Begin the app loop to collect input
            string menuOption = "";
            string response;

            // Display Options
            Console.WriteLine(menu);
            while (menuOption != "q")
            {
                // Collect Input
                menuOption = Console.ReadLine();
                if (InputValidation.IsValidMainMenuSelection(menuOption, out response))
                {
                    string input = "";
                    switch (menuOption)
                    {
                    case "p":
                        Console.WriteLine("You have selected [Place an order for an existing customer]. Please enter the customer ID you want to place the order for:");
                        string number = Console.ReadLine();

                        // Get input until a valid name is given
                        while (!InputValidation.IsValidNumber(number))
                        {
                            Console.WriteLine(response);
                            number = Console.ReadLine();
                        }
                        int id = Int32.Parse(number);

                        // Once a valid name is given try to assign it to a new object
                        var existingCustomer = new Customer();

                        // Get a customer from the database
                        Console.WriteLine("Searching db for customer...");
                        existingCustomer = storeRepository.GetCustomerWithLocationAndInventory(id);

                        // if an exception was thrown then end this switch
                        if (existingCustomer == null)
                        {
                            Console.WriteLine("Customer does not exist. Please pick a menu option to begin again.");
                            break;
                        }

                        // Continue though if the customer did exist
                        Console.WriteLine($"Selected Customer: {existingCustomer}");

                        // Begin the prompt to get each order line.
                        Console.WriteLine("Please enter the product ISBN and quantity separated by a comma.\nType [done] when order is complete.");
                        string orderlineItem;

                        // Create the new order to add the orderlines and to use the library methods to ensure that it is possible to create the order.
                        var order = new Order();
                        orderlineItem = Console.ReadLine();

                        // This function will fill the static list of the entire catalog to be used by any function or object
                        storeRepository.FillBookLibrary();

                        bool success = true;
                        // Collect input untill there is a failure
                        while (orderlineItem != "done")
                        {
                            // If a failure does occur let the user know they must begin transaction from the beginning
                            if (!order.AddNewOrderLine(orderlineItem))
                            {
                                Console.WriteLine("Either the ISBN does not exist in our library, our quantity was not a valid number," +
                                                  " or you attempted to place an order with an unreasonable amount of product."
                                                  + "\nPlease start process again from the main menu.");
                                success = !success;
                                break;
                            }
                            // Let them know if it a success and then continue collecting input until it fails
                            Console.WriteLine("Successfully added to the order.");
                            orderlineItem = Console.ReadLine();
                        }
                        if (!success)
                        {
                            break;
                        }

                        // Now that we've collected and created all the objects we assign them to the order to be mapped later
                        order.CustomerPlaced = existingCustomer;
                        order.LocationPlaced = existingCustomer.MyStoreLocation;

                        // Before that though we want to make sure we can place the order with the given locations inventory
                        if (!order.LocationPlaced.AttemptOrderAtLocation(order, out response))
                        {
                            // If it failed, let the user know why and then end the switch
                            Console.WriteLine(response);
                            break;
                        }
                        Console.WriteLine(response);
                        // If it is possible then we send the data over to the db so that it is saved
                        Console.WriteLine("Placing order...");
                        storeRepository.PlaceAnOrderForACustomer(order);
                        Console.WriteLine("Order Placed!");
                        break;

                    case "a":
                        Console.WriteLine("You Have selected [Add New Customer]." + "\nPlease enter the name of the first and last name of the customer separated by a space:");
                        input = Console.ReadLine();

                        // Collect input until a valid name is given
                        while (!InputValidation.IsValidCustomerName(input, out response))
                        {
                            Console.WriteLine(response);
                            input = Console.ReadLine();
                        }

                        // attempt to attach the name to a model object if it fails let the user know that it failed and why
                        string[] newCustomerNames = input.Split(' ');
                        var      newCustomer      = new Customer();
                        try
                        {
                            newCustomer.FirstName = newCustomerNames[0];
                            newCustomer.LastName  = newCustomerNames[1];
                        }
                        catch (ArgumentException ex)
                        {
                            Console.WriteLine(ex.Message
                                              + "\nPlease start process again from the main menu.");
                            break;
                        }

                        // Add the new customer to the database
                        storeRepository.AddACustomer(newCustomer);

                        // let the user know that it was successful
                        Console.WriteLine($"Customer {newCustomer.FirstName} {newCustomer.LastName} was added with the default location.");
                        break;

                    case "sc":
                        Console.WriteLine("You Have selected [Search By Customer Name]." + "\nPlease enter the full name of the customer:");

                        input = Console.ReadLine();

                        // Collect input until a valid name is given
                        while (!InputValidation.IsValidCustomerName(input, out response))
                        {
                            Console.WriteLine(response);
                            input = Console.ReadLine();
                        }

                        string[] candidate = input.Split(' ');
                        var      a         = new Customer();

                        // Attempt to take the name and split it into two the customer
                        try
                        {
                            a.FirstName = candidate[0];
                            a.LastName  = candidate[1];
                        }

                        catch (ArgumentException ex)
                        {
                            Console.WriteLine(ex.Message);
                        }

                        // If the strings are valid then we attempt to find the customer
                        List <Customer> foundCustomer = storeRepository.FindCustomerByName(candidate);

                        // Let the user know what we found
                        if (foundCustomer.Count() == 0)
                        {
                            Console.WriteLine($"No customer by the name of {candidate[0]} {candidate[1]} exists in the database.");
                        }
                        else
                        {
                            foreach (Customer c in foundCustomer)
                            {
                                Console.WriteLine(c);
                            }
                        }
                        break;

                    case "ddo":
                        Console.WriteLine("You Have selected [Display Details of an Order]." + "\nPlease enter the order number:");
                        input = Console.ReadLine();

                        // Do Some input validation
                        while (!InputValidation.IsValidNumber(input))
                        {
                            Console.WriteLine("Input was not a number, please input a number.");
                            input = Console.ReadLine();
                        }

                        Console.WriteLine(storeRepository.GetDetailsForOrder(Int32.Parse(input)));
                        break;

                    case "dhl":
                        Console.WriteLine("You Have selected [Display Order History of Location]." + "\nPlease enter the location ID:");
                        input = Console.ReadLine();

                        // do some input validation
                        while (!InputValidation.IsValidNumber(input))
                        {
                            Console.WriteLine("Input was not a number, please input a number.");
                            input = Console.ReadLine();
                        }

                        Console.WriteLine(storeRepository.GetOrderHistoryByLocationID(Int32.Parse(input)));
                        break;

                    case "dhc":
                        Console.WriteLine("You Have selected [Display Order History of Customer]. Please enter the customer ID:");
                        input = Console.ReadLine();

                        // do some input validation until a valid two string is given
                        while (!InputValidation.IsValidNumber(input))
                        {
                            Console.WriteLine(response);
                            input = Console.ReadLine();
                        }

                        // Print what was found
                        Console.WriteLine(storeRepository.GetOrderHistoryByCustomer(Int32.Parse(input)));
                        break;

                    case "help":
                        // Print the menu options again for those that need it
                        Console.WriteLine(menu);
                        break;

                    case "q":
                        // Exit the program.
                        Console.WriteLine("You Have selected [Quit].");
                        break;
                    }
                }
                else
                {
                    Console.WriteLine(response);
                }
            }
        }