/// <summary>
        /// Gets all the scheduled content where the content is scheduled after datetime.now
        /// </summary>
        /// <returns>Future content, sorted by beacon</returns>
        public IEnumerable <BeaconAvailability> GetFutureScheduledContent()
        {
            // This is a complex query, so need to draw on beacon and content data
            List <BeaconAvailability> beaconAvailability = new List <BeaconAvailability>();

            using (var db = new ApplicationDbContext())
            {
                foreach (var beacon in db.Beacons)
                {
                    var availability = new BeaconAvailability();
                    availability.BeaconId     = beacon.Id;
                    availability.FriendlyName = beacon.FriendlyName;
                    availability.Location     = beacon.Location;
                    availability.Bookings     = db.ScheduledItems.Where(item => item.BeaconId == beacon.Id && item.EndDateTime >= DateTime.Now)
                                                .Select(b => new BeaconBooking()
                    {
                        Start       = b.StartDateTime,
                        End         = b.EndDateTime,
                        Description = db.Content.FirstOrDefault(c => c.Id == b.ContentId).Title,
                        ContentId   = b.ContentId
                    }).ToList();

                    beaconAvailability.Add(availability);
                }
            }

            return(beaconAvailability);
        }
        private static IList <Timeslot> PopulateWeeksForBeacon(BeaconAvailability beaconAvailability, DateTime startTime)
        {
            var      slots       = new List <Timeslot>();
            DateTime currentDate = startTime;

            while (currentDate < DateTime.Now.AddMonths(3))
            {
                Timeslot newTimeslot = new Timeslot();
                newTimeslot.Start = currentDate;
                newTimeslot.End   = currentDate.AddDays(7);
                newTimeslot.Unit  = TimeslotUnit.Weeks;

                // Select bookings which start or end in this period
                newTimeslot.Bookings = beaconAvailability.Bookings.Where(b =>
                                                                         (b.Start >= newTimeslot.Start && b.Start < newTimeslot.End) ||
                                                                         (b.End > newTimeslot.Start && b.End <= newTimeslot.End)).Select(booking => new TimeslotBooking()
                {
                    ContentId    = booking.ContentId,
                    ContentTitle = booking.Description
                }).ToList();
                newTimeslot.Timeslots = PopulateDaysOfWeekForBeacon(beaconAvailability, currentDate.Date, currentDate.AddDays(7).Date);

                currentDate = currentDate.AddDays(7);
                slots.Add(newTimeslot);
            }

            return(slots);
        }
        private static IList <Timeslot> PopulateHoursOfDayForBeacon(BeaconAvailability beaconAvailability, DateTime startDate, DateTime endTime)
        {
            var slots       = new List <Timeslot>();
            var currentDate = startDate;

            while (currentDate < endTime)
            {
                Timeslot newTimeslot = new Timeslot();
                newTimeslot.Start    = currentDate;
                newTimeslot.End      = currentDate.AddHours(1);
                newTimeslot.Unit     = TimeslotUnit.Hours;
                newTimeslot.Bookings = beaconAvailability.Bookings.Where(b => b.Start >= newTimeslot.Start && b.End <= newTimeslot.End).Select(booking => new TimeslotBooking()
                {
                    ContentId    = booking.ContentId,
                    ContentTitle = booking.Description
                }).ToList();

                currentDate = currentDate.AddHours(1);
                slots.Add(newTimeslot);
            }

            return(slots);
        }