/// <summary>
        /// Get all the data to build the calendar.
        /// </summary>
        /// <returns></returns>
        private IEnumerable <CalendarYear> GetCalendarData()
        {
            var calendar = Enumerable
                           .Range(0, (int)currentDate.AddMonths(MaximumMonthsToDisplay).Subtract(currentDate).TotalDays)
                           .Select(d => currentDate.AddDays(d))
                           .Select(d => new { Date = d, Weekday = currentCulture.Calendar.GetDayOfWeek(d), WeekNr = currentCulture.Calendar.GetWeekOfYear(d, currentCulture.DateTimeFormat.CalendarWeekRule, currentCulture.DateTimeFormat.FirstDayOfWeek) })
                           .GroupBy(d => new { d.Date.Year, d.Date.Month, d.WeekNr })
                           .GroupBy(d => new { d.Key.Year, d.Key.Month })
                           .Select(y => new CalendarYear
            {
                Month = y.Key.Month,
                Year  = y.Key.Year,
                Weeks = y.Select(w => new CalendarWeek
                {
                    Weeknumber = w.Key.WeekNr,
                    Days       = w.Select(d => new CalendarDay
                    {
                        Date      = d.Date,
                        DayOfWeek = d.Weekday,
                        Status    = OccupiedDateRanges != null && OccupiedDateRanges.Any(o => d.Date >= o.Start && d.Date <= o.End) ? DayStatus.Occupied : DayStatus.Free
                    })
                })
            });

            return(calendar);
        }
        /// <summary>
        /// Get the first occupied date after the selected start. To determine if we can select the MinimumDaysToSelect.
        /// </summary>
        /// <returns>DateTime</returns>
        private DateTime?GetFirstOccupiedDateAfterStartDate()
        {
            if (OccupiedDateRanges == null || !startDate.HasValue)
            {
                return(null);
            }

            return(OccupiedDateRanges.OrderBy(o => o.Start).FirstOrDefault(o => startDate < o.Start)?.Start);
        }