//id == reservation id
        //manager will choose tables to add reservations
        public async Task <IActionResult> Tables(int id)
        {
            //get all tables and area
            var tables = await _db.Tables.Include(t => t.Area).OrderBy(t => t.Area.Name).ThenBy(t => t.Name).ToListAsync();

            //get reservations
            //include if res has table setting
            var reservation = await _db.Reservations
                              .Include(r => r.TableReservations)         //get assigened reserTables
                              .ThenInclude(tr => tr.Table)
                              .FirstOrDefaultAsync(r => r.Id == id);     //reservation id

            //set the reservation to the Creating Table
            var m = new Models.Area.Tables {
                Reservation = reservation
            };

            //just assigned to reserva
            //now we e
            //table is from DB

            //do 30 times for 30 tables.
            foreach (var t in tables)
            {
                var tableDetail = new Models.Area.TableDetails
                {
                    TableId   = t.Id,
                    TableName = t.Name,
                    AreaName  = t.Area.Name,
                    //if there is any tables set before==>true
                    Selected = reservation.TableReservations.Any(rt => rt.TableId == t.Id)
                };
                m.TableDetails.Add(tableDetail);
            }

            //logic
            var reservationTables = await _db.TableReservations.ToArrayAsync();

            List <int> IdOfReservationWithLaterEndTime = new List <int>();

            //get all the tables that has reservations
            foreach (var rt in reservationTables)
            {
                //reservation that has table already
                var reser = await _db.Reservations.FirstOrDefaultAsync(r => r.Id == rt.ReservationId);

                if (reser.EndTime > reservation.StartTime) //if the tables has reservation and their end time is later
                                                           //than what user choose, then the table shouldn't be able to the user to select.
                                                           //erase from the array.
                {
                    var deleted = m.TableDetails.FirstOrDefault(m => m.TableId == rt.TableId);

                    m.TableDetails.Remove(deleted);
                }
            }



            return(View(m));
        }
        //id == reservation id
        //manager will choose tables to add reservations
        public async Task <IActionResult> Tables(Models.Area.Tables m)
        {
            try
            {
                int id = m.Reservation.Id;

                //clear the previous selected tables from the res
                var reservation = await _db.Reservations
                                  .Include(r => r.TableReservations)
                                  .ThenInclude(tr => tr.Table)
                                  .FirstOrDefaultAsync(r => r.Id == id);

                //first remove all existing tables assigned to the reservation
                reservation.TableReservations.Clear();
                await _db.SaveChangesAsync();

                var endTime = reservation.EndTime;//get end time


                //add the selected tables to db
                var selectedTables = m.TableDetails.Where(to => to.Selected);


                foreach (var st in selectedTables)
                {
                    //set the selected table to the tableReservations-connection table
                    var tr = new TableReservation {
                        TableId = st.TableId
                    };
                    //add the connection table to reservation
                    reservation.TableReservations.Add(tr);
                }

                await _db.SaveChangesAsync();

                return(RedirectToAction("Index", "Reservation", new { Area = "Staff" }));
            }
            catch (Exception)
            {
                return(View(m));
            }
        }