/// <summary>
 /// Staff menu
 /// </summary>
 static void StaffMenu()
 {
     if (!staffVerified)
     {
         StaffLogin();
     }
     else
     {
         Console.WriteLine(
             "\n=============Staff Menu==========\n" +
             "1. Add a new movie DVD\n" +
             "2. Remove a movie DVD\n" +
             "3. Register a new Member\n" +
             "4. Find a registered member's phone number\n" +
             "0. Return to main menu\n" +
             "=================================");
         appStatus = (Reusables.waitUserResponse("\n Please make a selection (1-4 or 0 to return to main menu): ", new int[] { 0, 1, 2, 3, 4 })) switch
         {
             0 => AppStatus.MainMenu,
             1 => AppStatus.Staff1,
             2 => AppStatus.Staff2,
             3 => AppStatus.Staff3,
             4 => AppStatus.Staff4,
             _ => AppStatus.MainMenu,
         };
     }
 }
 /// <summary>
 /// constructor
 /// </summary>
 /// <param name="givenName">member's given name</param>
 /// <param name="familyName">member's family name</param>
 /// <param name="address">member's address</param>
 /// <param name="phoneNumber">member's phone number</param>
 /// <param name="password">member's password</param>
 public Member(string givenName, string familyName, string address, string phoneNumber, string password)
 {
     this.givenName   = Reusables.ToTitleCase(givenName);
     this.familyName  = Reusables.ToTitleCase(familyName);
     this.address     = address;
     this.phoneNumber = phoneNumber;
     this.username    = Reusables.ToTitleCase(familyName) + Reusables.ToTitleCase(givenName);
     this.password    = password;
 }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="title">title of this movie</param>
 /// <param name="starring">starring of this movie</param>
 /// <param name="director">director of this movie</param>
 /// <param name="duration">duration of this movie</param>
 /// <param name="genre">gener of this movie</param>
 /// <param name="classification">classfication of this movie</param>
 /// <param name="releaseDate">release date of this movie</param>
 /// <param name="numCopies">number of copies available of this movie</param>
 public Movie(string title, string starring, string director, int duration, Genre genre, Classification classification, int releaseDate, int numCopies)
 {
     this.title          = Reusables.ToTitleCase(title);
     this.starring       = starring;
     this.director       = director;
     this.duration       = duration;
     this.genre          = genre;
     this.classification = classification;
     this.releaseDate    = releaseDate;
     this.numCopies      = numCopies;
 }
        /// <summary>
        /// Helps input menu for staff to add a movie
        /// This simply create a movie object based on the input
        /// No duplication check
        /// </summary>
        /// <returns>Movie object</returns>
        public static Movie Staff1()
        {
            Console.WriteLine("\n=====Add Movie=====");
            Console.Write("Title: ");
            string title = Console.ReadLine();

            Console.Write("Starring: ");
            string starring = Console.ReadLine();

            Console.Write("Director: ");
            string director = Console.ReadLine();
            int    duration = Reusables.waitUserIntegerResponse("Duration(minutes): ");
            Genre  genre    = (Reusables.waitUserResponse("Genre:\n" +
                                                          "1. Drama\n" +
                                                          "2. Adventure\n" +
                                                          "3. Family\n" +
                                                          "4. Action\n" +
                                                          "5. Sci-Fi\n" +
                                                          "6. Comedy\n" +
                                                          "7. Animated\n" +
                                                          "8. Thriller\n" +
                                                          "9. Other\n" +
                                                          "Select: ", new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 })) switch
            {
                1 => Genre.Drama,
                2 => Genre.Adventure,
                3 => Genre.Family,
                4 => Genre.Action,
                5 => Genre.SciFi,
                6 => Genre.Comedy,
                7 => Genre.Animated,
                8 => Genre.Thriller,
                9 => Genre.Other,
                _ => Genre.Other,
            };
            Classification classification = (Reusables.waitUserResponse("Classification:\n" +
                                                                        "1. General (G)\n" +
                                                                        "2. Parental Guidance (PG)\n" +
                                                                        "3. Mature (M15+)\n" +
                                                                        "4. Mature Accompanies (MA15+)\n" +
                                                                        "Select: ", new int[] { 1, 2, 3, 4 })) switch
            {
                1 => Classification.General,
                2 => Classification.ParentalGuidance,
                3 => Classification.Mature,
                4 => Classification.MatureAccompanied,
                _ => Classification.General,
            };
            int releaseDate = Reusables.waitUserIntegerResponse("Release date (year): ");
            int numCopies   = Reusables.waitUserIntegerResponse("Number of copies: ");

            return(new Movie(title, starring, director, duration, genre, classification, releaseDate, numCopies));
        }
 /// <summary>
 /// List all movies that the member is currently borrowing
 /// </summary>
 static void Member4Package()
 {
     if (user.NumBorrowing == 0)
     {
         Console.WriteLine("\n ** You have no movies borrowing ** \n");
     }
     else
     {
         Console.WriteLine(MemberOptions.Member4(user.GetBorrowingMovies()));
         Reusables.waitUserPressEnter();
     }
     appStatus = AppStatus.MemberMenu;
 }
        /// <summary>
        /// Supports input for borrowing movie
        /// </summary>
        /// <param name="movies">all available movies in Movie Collection</param>
        /// <returns>title of the movie that is selected by the member</returns>
        public static string Member2(Movie[] movies)
        {
            Console.WriteLine("\n=====Borrow movie=====");
            // display all movie title in the store
            for (int i = 0; i < movies.Length; i++)
            {
                Console.WriteLine("{0}. {1}", i + 1, movies[i].title);
            }
            // ask which title they want to borrow (input by number)
            int res = Reusables.waitUserResponse("Select by number: ", Reusables.createIntArray(1, movies.Length));

            // return title
            return(movies[res - 1].title);
        }
        /// <summary>
        /// Member menu
        /// </summary>
        static void MemberMenu()
        {
            if (!memberVerified)
            {
                MemberLogin();
            }
            else
            {
                Console.WriteLine(
                    "\n==============Member Menu=========\n" +
                    "1. Dispaly all movies\n" +
                    "2. Borrow a movie DVD\n" +
                    "3. Return a moive DVD\n" +
                    "4. List current borrowed movie DVDs\n" +
                    "5. Display top 10 most popular movies\n" +
                    "0. Return to main menu\n" +
                    "===================================");
                switch (Reusables.waitUserResponse("\n Please make a selection (1-5 or 0 to return to main menu): ", new int[] { 0, 1, 2, 3, 4, 5 }))
                {
                case 0:
                    appStatus = AppStatus.MainMenu;
                    break;

                case 1:
                    appStatus = AppStatus.Member1;
                    break;

                case 2:
                    appStatus = AppStatus.Member2;
                    break;

                case 3:
                    appStatus = AppStatus.Member3;
                    break;

                case 4:
                    appStatus = AppStatus.Member4;
                    break;

                case 5:
                    appStatus = AppStatus.Member5;
                    break;

                default:
                    appStatus = AppStatus.MainMenu;
                    break;
                }
            }
        }
        /// <summary>
        /// Helps input for staff to register new member
        /// This simply creates a member object, and so
        /// the duplication check should be performed after getting a value returned from this method
        /// </summary>
        /// <returns>Member object</returns>
        public static Member Staff3()
        {
            Console.WriteLine("\n=====Add new member===");
            Console.Write("Given name: ");
            string givenName = Console.ReadLine();

            Console.Write("Family name: ");
            string familyName = Console.ReadLine();

            Console.Write("Address: ");
            string address = Console.ReadLine();

            Console.Write("Phone number: ");
            string phoneNumber = Console.ReadLine();
            string password    = Reusables.waitUserSetPassword("Password: ");

            return(new Member(givenName, familyName, address, phoneNumber, password));
        }
 /// <summary>
 /// Landing page
 /// </summary>
 static void MainMenu()
 {
     staffVerified  = false;
     memberVerified = false;
     Console.WriteLine(
         "\nWelcome to the Community Library\n" +
         "===========Main Menu============\n" +
         "1. Staff Login\n" +
         "2. Member Login\n" +
         "0. Exit\n" +
         "================================");
     appStatus = (Reusables.waitUserResponse("\n Please make a selection (1-2, or 0 to exit): ", new int[] { 0, 1, 2 })) switch
     {
         0 => AppStatus.Exit,
         1 => AppStatus.StaffMenu,
         2 => AppStatus.MemberMenu,
         _ => AppStatus.Exit,
     };
 }
        /// <summary>
        /// Supports input for returning movie
        /// </summary>
        /// <param name="borrowing">All movies that the user is currently borrowing</param>
        /// <returns>title of movie to be returned</returns>
        public static string Member3(Movie[] borrowing)
        {
            Console.WriteLine("\n=====Return movie=====");
            // remove null value and create new array for easy handling
            Movie[] nullRemoved = new Movie[0];
            foreach (Movie m in borrowing)
            {
                if (m != null)
                {
                    Array.Resize(ref nullRemoved, nullRemoved.Length + 1);
                    nullRemoved[nullRemoved.Length - 1] = m;
                }
            }
            for (int i = 0; i < nullRemoved.Length; i++)
            {
                Console.WriteLine("{0}. {1}", i + 1, nullRemoved[i].title);
            }
            // ask which title they want to borrow (input by number)
            int res = Reusables.waitUserResponse("Select by number: ", Reusables.createIntArray(1, nullRemoved.Length));

            // return title
            return(nullRemoved[res - 1].title);
        }
 /// <summary>
 /// Display top 10 most popular movies
 /// </summary>
 static void Member5Package()
 {
     Console.WriteLine(MemberOptions.Member5(movieCollection.GetTopTenMovies()));
     Reusables.waitUserPressEnter();
     appStatus = AppStatus.MemberMenu;
 }
 /// <summary>
 /// Display all movies
 /// </summary>
 static void Member1Package()
 {
     Console.WriteLine(MemberOptions.Member1(movieCollection.GetAlphabetical()));
     Reusables.waitUserPressEnter();
     appStatus = AppStatus.MemberMenu;
 }