private void extendStayBtn_Click(object sender, RoutedEventArgs e)
        {
            string result = "";

            foreach (Guest guest in guestList)
            {
                if (guest.Name == guestTxt.Text)
                {
                    guest.HotelStay.CheckOutDate = guest.HotelStay.CheckOutDate.AddDays(1); //add one day to the checkoutDate [3.3]
                    availableTxt.Text            = "Rooms Booked by: " + guest.Name + " (" + guest.PPNumber + ")\n" + "Check In: " + guest.HotelStay.CheckInDate + " Check Out: " + guest.HotelStay.CheckOutDate;
                    foreach (HotelRoom room in guest.HotelStay.RoomList)
                    {
                        if (room.RoomType == "Standard")
                        {
                            StandardRoom sr             = (StandardRoom)room;
                            bool         checkwifi      = sr.RequireWifi;
                            bool         checkbreakfast = sr.RequireBreakfast;
                            double       days           = (guest.HotelStay.CheckOutDate - guest.HotelStay.CheckInDate).TotalDays;
                            Debug.WriteLine(days);
                            double totalcost  = guest.HotelStay.CalculateTotal();
                            double roomNumber = Convert.ToInt32(room.RoomNumber);
                            result = "You are staying for " + days + " nights in room number " + roomNumber + "\nWifi addon: " + checkwifi + "\tBreakfast addon: " + checkbreakfast + "\tTotal amount is $" + totalcost + "\n";
                        }
                        else if (room.RoomType == "Deluxe")
                        {
                            DeluxeRoom dr         = (DeluxeRoom)room;
                            bool       checkbed   = dr.AdditionalBed;
                            double     days       = (guest.HotelStay.CheckOutDate - guest.HotelStay.CheckInDate).TotalDays;
                            double     totalcost  = guest.HotelStay.CalculateTotal();
                            double     roomNumber = Convert.ToInt32(room.RoomNumber);
                            result = "You are staying for " + days + " nights in room number " + roomNumber + "\nAdditional Bed " + checkbed + "\nTotal amount is $" + totalcost + "\n";
                        }
                        invoiceText.Text = result;
                    }
                }
            }
        }
        private void CheckOutBtn_Click(object sender, RoutedEventArgs e)
        {
            foreach (Guest g in guestList)
            {
                if (g.Name == guestTxt.Text || g.PPNumber == passportTxt.Text)
                {
                    //g.HotelStay.RoomList.Clear();
                    for (int i = 0; i < g.HotelStay.RoomList.Count; i++)
                    {
                        if (g.HotelStay.RoomList[i].RoomType == "Standard")
                        {
                            StandardRoom sr = (StandardRoom)g.HotelStay.RoomList[i];
                            sr.RequireWifi      = false;
                            sr.RequireBreakfast = false;
                            sr.IsAvail          = true;
                            availableRooms.Add(sr);
                            double totalamount = g.HotelStay.CalculateTotal();
                            double points      = totalamount / 10;
                            invoiceText.Text      = "Thank you for staying with us!\n You have earned " + Math.Round(points, 1) + " points\nIt will be credited to your account.";
                            statusUpdateText.Text = "Check-Out Successful!";
                            double totalpoints = g.Membership.Points + points;
                            if (g.Membership.Status == "Ordinary")
                            {
                                if (totalpoints >= 200)
                                {
                                    Membership m = new Membership("Gold", Convert.ToInt32(totalpoints));
                                    g.Membership = m;
                                }
                                else if (totalpoints >= 100)
                                {
                                    Membership m = new Membership("Silver", Convert.ToInt32(totalpoints));
                                    g.Membership = m;
                                }
                            }
                            else if (g.Membership.Status == "Silver")
                            {
                                if (totalpoints >= 200)
                                {
                                    Membership m = new Membership("Gold", Convert.ToInt32(totalpoints));
                                    g.Membership = m;
                                }
                            }
                            memberStatusText.Text    = "Member Status: " + g.Membership.Status;
                            pointsAvailableText.Text = "Available Points: " + Convert.ToString(totalpoints);
                            g.Membership.EarnPoints(totalamount);
                            g.HotelStay.RoomList.Remove(sr);
                        }

                        else if (g.HotelStay.RoomList[i].RoomType == "Deluxe")
                        {
                            DeluxeRoom dr = (DeluxeRoom)g.HotelStay.RoomList[i];
                            dr.AdditionalBed = false;
                            dr.IsAvail       = true;
                            availableRooms.Add(dr);
                            double totalamount = g.HotelStay.CalculateTotal();
                            double points      = totalamount / 10;
                            invoiceText.Text      = "Thank you for staying with us!\n You have earned " + Math.Round(points, 1) + " points\nIt will be credited to your account.";
                            statusUpdateText.Text = "Check-Out Successful!";
                            double totalpoints = g.Membership.Points + points;
                            if (g.Membership.Status == "Ordinary")
                            {
                                if (totalpoints >= 200)
                                {
                                    Membership m = new Membership("Gold", Convert.ToInt32(totalpoints));
                                    g.Membership = m;
                                }
                                else if (totalpoints >= 100)
                                {
                                    Membership m = new Membership("Silver", Convert.ToInt32(totalpoints));
                                    g.Membership = m;
                                }
                            }
                            else if (g.Membership.Status == "Silver")
                            {
                                if (totalpoints >= 200)
                                {
                                    Membership m = new Membership("Gold", Convert.ToInt32(totalpoints));
                                    g.Membership = m;
                                }
                            }
                            memberStatusText.Text    = "Member Status: " + g.Membership.Status;
                            pointsAvailableText.Text = "Available Points: " + Convert.ToString(totalpoints);
                            g.Membership.EarnPoints(totalamount);
                            g.HotelStay.RoomList.Remove(dr);
                        }
                    }
                    availableTxt.Text = "Available rooms:";
                    RefreshList();
                }
            }
        }
        private void SearchBtn_Click(object sender, RoutedEventArgs e)
        {
            availableTxt.Text = "Available rooms:";
            invoiceText.Text  = "";
            string result = "";

            lvAvailableRooms.ItemsSource = null;
            lvAvailableRooms.Items.Clear();
            string checkwifi      = "";
            string checkbreakfast = "";

            if (guestTxt.Text != "" || guestTxt.Text != " " || passportTxt.Text != "" || passportTxt.Text != " ")
            {
                foreach (Guest guest in guestList)
                {
                    if (guest.Name == guestTxt.Text || guest.PPNumber == passportTxt.Text)
                    {
                        availableTxt.Text        = "Rooms Booked by: " + guest.Name + " (" + guest.PPNumber + ")\n" + "Check In: " + guest.HotelStay.CheckInDate + " Check Out: " + guest.HotelStay.CheckOutDate;
                        memberStatusText.Text    = "Member Status: " + guest.Membership.Status;
                        pointsAvailableText.Text = "Points Available: " + guest.Membership.Points;
                        foreach (HotelRoom h in guest.HotelStay.RoomList)
                        {
                            lvAvailableRooms.Items.Add(h);
                            if (h.RoomType == "Standard")
                            {
                                StandardRoom sr = (StandardRoom)h;
                                if (addWifiCheckBox.IsChecked == true)
                                {
                                    checkwifi = "Yes";
                                }

                                if (addBreakfastCheckBox.IsChecked == true)
                                {
                                    checkbreakfast = "Yes";
                                }
                                double days       = (guest.HotelStay.CheckOutDate - guest.HotelStay.CheckInDate).TotalDays;
                                double totalcost  = guest.HotelStay.CalculateTotal();
                                double roomNumber = Convert.ToDouble(h.RoomNumber);
                                result += "You are staying for " + days + " nights in room number " + roomNumber + "\nWifi addon: " + checkwifi + "\tBreakfast addon: " + checkbreakfast + "\tTotal amount is $" + totalcost + "\n";
                                //noOfAdultTxt.Text = sr.RequireWifi.ToString();
                            }

                            else if (h.RoomType == "Deluxe")
                            {
                                DeluxeRoom dr         = (DeluxeRoom)h;
                                bool       checkbed   = dr.AdditionalBed;
                                double     days       = (guest.HotelStay.CheckOutDate - guest.HotelStay.CheckInDate).TotalDays;
                                double     totalcost  = guest.HotelStay.CalculateTotal();
                                double     roomNumber = Convert.ToDouble(h.RoomNumber);
                                result += "You are staying for " + days + " nights in room number " + roomNumber + "\nAdditional Bed " + checkbed + "\tTotal amount is $" + totalcost + "\n";
                            }
                        }
                    }
                    if (guestTxt.Text != "" && passportTxt.Text != "")
                    {
                        availableTxt.Text = "Please search by one method only.";
                    }

                    if ((availableTxt.Text == "Available rooms:") && (guestTxt.Text != "" || passportTxt.Text != ""))
                    {
                        availableTxt.Text = "No rooms under that name or passport number found.";
                    }
                }
                invoiceText.Text += result;
            }
        }
        public void InitData() //create room objects
        {
            //standard room objects
            HotelRoom room1 = new StandardRoom("Standard", "101", "Single", 90, false, 2);
            HotelRoom room2 = new StandardRoom("Standard", "102", "Single", 90, true, 2);
            HotelRoom room3 = new StandardRoom("Standard", "201", "Twin", 110, true, 4);
            HotelRoom room4 = new StandardRoom("Standard", "202", "Twin", 110, false, 4);
            HotelRoom room5 = new StandardRoom("Standard", "203", "Twin", 110, true, 4);
            HotelRoom room6 = new StandardRoom("Standard", "301", "Triple", 120, true, 6);
            HotelRoom room7 = new StandardRoom("Standard", "302", "Triple", 120, false, 6);
            //deluxe room objects
            HotelRoom room8  = new DeluxeRoom("Deluxe", "204", "Twin", 140, true, 4);
            HotelRoom room9  = new DeluxeRoom("Deluxe", "205", "Twin", 140, true, 4);
            HotelRoom room10 = new DeluxeRoom("Deluxe", "303", "Triple", 210, false, 6);
            HotelRoom room11 = new DeluxeRoom("Deluxe", "304", "Triple", 210, true, 6);

            //adding to hotelList
            hotelList.Add(room1);
            hotelList.Add(room2);
            hotelList.Add(room3);
            hotelList.Add(room4);
            hotelList.Add(room5);
            hotelList.Add(room6);
            hotelList.Add(room7);
            hotelList.Add(room8);
            hotelList.Add(room9);
            hotelList.Add(room10);
            hotelList.Add(room11);

            //first guest information
            Stay             s1        = new Stay(Convert.ToDateTime("26-Jan-2019"), Convert.ToDateTime("02-Feb-2019"));
            List <HotelRoom> roomList1 = s1.RoomList;

            s1.AddRoom(room1);
            Membership m1 = new Membership("Gold", 280);
            Guest      g1 = new Guest("Amelia", "S1234567A", s1, m1, true);
            //second guest information
            Stay             s2        = new Stay(Convert.ToDateTime("25-Jan-2019"), Convert.ToDateTime("31-Jan-2019"));
            List <HotelRoom> roomList2 = s2.RoomList;

            s2.AddRoom(room7);
            Membership m2 = new Membership("Ordinary", 0);
            Guest      g2 = new Guest("Bob", "G1234567A", s2, m2, true);
            //third guest information
            Stay             s3        = new Stay(Convert.ToDateTime("01-Feb-2019"), Convert.ToDateTime("06-Feb-2019"));
            List <HotelRoom> roomList3 = s3.RoomList;

            s3.AddRoom(room4);
            Membership m3 = new Membership("Silver", 190);
            Guest      g3 = new Guest("Cody", "G234567A", s3, m3, true);
            //fourth guest information
            Stay             s4        = new Stay(Convert.ToDateTime("28-Jan-2019"), Convert.ToDateTime("10-Feb-2019"));
            List <HotelRoom> roomList4 = s4.RoomList;

            s4.AddRoom(room10);
            Membership m4 = new Membership("Gold", 10);
            Guest      g4 = new Guest("Edda", "S3456789A", s4, m4, true);

            //adding guest objects into guestList
            guestList.Add(g1);
            guestList.Add(g2);
            guestList.Add(g3);
            guestList.Add(g4);


            StandardRoom srroom101 = (StandardRoom)room1;

            srroom101.RequireWifi      = true;
            srroom101.RequireBreakfast = true;

            StandardRoom srroom302 = (StandardRoom)room7;

            srroom101.RequireBreakfast = true;

            StandardRoom srroom202 = (StandardRoom)room4;

            srroom202.RequireBreakfast = true;

            DeluxeRoom srroom303 = (DeluxeRoom)room10;

            srroom303.AdditionalBed = true;
        }
        } //updates the listview

        private void checkInBtn_Click(object sender, RoutedEventArgs e)
        {
            bool check = false;

            foreach (Guest g in guestList)
            {
                if (guestTxt.Text != g.Name)
                {
                    check = true;
                }
            }
            if (passportTxt.Text == "" || passportTxt.Text == " ")
            {
                statusUpdateText.Text = "Please enter a Passport Number";
            }
            else
            {
                if (check == true)                                                                                                                      //if guest.text cannot be found in the guestList.Name
                {
                    Stay       s     = new Stay(DateTime.Parse(checkInDatePicker.Date.ToString()), DateTime.Parse(checkOutDatePicker.Date.ToString())); //get datestart and dateend
                    Membership m     = new Membership("Ordinary", 0);
                    Guest      guest = new Guest(guestTxt.Text, passportTxt.Text, s, m, false);                                                         //create guest info 1:1
                    guestList.Add(guest);                                                                                                               //add into guestList
                    string roomscheckedin = "";
                    for (var i = 0; i < tempRoomList.Count; i++)
                    {
                        HotelRoom r = tempRoomList[i];
                        r.IsAvail       = false;
                        r.NoOfOccupants = Convert.ToInt32(noOfAdultTxt.Text) + Convert.ToInt32(noOfChildrentxt.Text);
                        if (r.RoomType == "Standard")
                        {
                            HotelRoom h         = new StandardRoom(r.RoomType, r.RoomNumber, r.BedConfiguration, r.DailyRate, r.IsAvail, r.NoOfOccupants);
                            int       noOfGuest = (Convert.ToInt32(noOfAdultTxt.Text) / 2) + (Convert.ToInt32(noOfChildrentxt.Text));
                            if (noOfGuest <= r.NoOfOccupants)
                            {
                                s.AddRoom(h);
                            }
                            else
                            {
                                statusUpdateText.Text = "Add an Additional Bed\nOr Change Your Selected Choice";
                            }
                        }
                        else if (r.RoomType == "Deluxe")
                        {
                            HotelRoom h         = new DeluxeRoom(r.RoomType, r.RoomNumber, r.BedConfiguration, r.DailyRate, r.IsAvail, r.NoOfOccupants);
                            int       noOfGuest = (Convert.ToInt32(noOfAdultTxt.Text) / 2) + (Convert.ToInt32(noOfChildrentxt.Text));
                            if (noOfGuest < r.NoOfOccupants)
                            {
                                s.AddRoom(h);
                            }
                            else
                            {
                                statusUpdateText.Text = "Add an Additional Bed\nOr Change Your Selected Choice";
                            }
                        }
                        List <HotelRoom> roomList         = s.RoomList;
                        string           guestStayDetails = "";
                        foreach (HotelRoom room in roomList)
                        {
                            guestStayDetails += room.ToString() + guest.ToString();
                        }
                        roomsBookedTxt.Text = guestStayDetails;
                        roomscheckedin     += r.RoomNumber.ToString() + " ";
                    }
                    tempRoomList.Clear(); //clears the selected room list
                    RefreshList();        //refreshes room list [2.1.5]
                    statusUpdateText.Text = "Status update: Rooms" + " " + roomscheckedin + "checked in successfully.";
                    roomscheckedin        = "";
                }
                else if (check == false)                         //existing guest code goes here [2.1.6]
                {
                    for (var i = 0; i < tempRoomList.Count; i++) //loops thru the tempRoomList
                    {
                        HotelRoom r = tempRoomList[i];
                        r.IsAvail       = false;                                                                      //sets every room isAvail to false
                        r.NoOfOccupants = Convert.ToInt32(noOfAdultTxt.Text) + Convert.ToInt32(noOfChildrentxt.Text); //calculates total number of occupants
                        if (r.RoomType == "Standard")                                                                 //checks if the room is standard. if it is, create a standard room object
                        {
                            HotelRoom h = new StandardRoom(r.RoomType, r.RoomNumber, r.BedConfiguration, r.DailyRate, r.IsAvail, r.NoOfOccupants);
                            foreach (Guest g in guestList)
                            {
                                if (g.Name == guestTxt.Text)
                                {
                                    int noOfGuest = (Convert.ToInt32(noOfAdultTxt.Text) / 2) + (Convert.ToInt32(noOfChildrentxt.Text));
                                    if (noOfGuest <= r.NoOfOccupants)
                                    {
                                        g.HotelStay.AddRoom(h); //add it into the guest.RoomList
                                    }
                                    else
                                    {
                                        statusUpdateText.Text = "Add an Additional Bed\nOr Change Your Selected Choice";
                                    }
                                }
                            }
                        }
                        else if (r.RoomType == "Deluxe") //checks if the room is deluxe. if it is, create a deluxe room object
                        {
                            HotelRoom h = new DeluxeRoom(r.RoomType, r.RoomNumber, r.BedConfiguration, r.DailyRate, r.IsAvail, r.NoOfOccupants);
                            foreach (Guest g in guestList)
                            {
                                if (g.Name == guestTxt.Text)
                                {
                                    int noOfGuest = (Convert.ToInt32(noOfAdultTxt.Text) / 2) + (Convert.ToInt32(noOfChildrentxt.Text));
                                    if (noOfGuest < r.NoOfOccupants)
                                    {
                                        g.HotelStay.AddRoom(h);  //add it into the guest.RoomList
                                    }
                                    else
                                    {
                                        statusUpdateText.Text = "Add an Additional Bed\nOr Change Your Selected Choice";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }