using System; using System.Collections.Generic; using System.Linq; using Itenso.TimePeriod; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; namespace Wino.Core.Domain.Models.Calendar { /// /// Represents a range of days in the calendar. /// Corresponds to 1 view of the FlipView in CalendarPage. /// public class DayRangeRenderModel { public event EventHandler CalendarDayEventCollectionUpdated; public ITimePeriod Period { get; } public List CalendarDays { get; } = []; public List DayHeaders { get; } = []; public CalendarRenderOptions CalendarRenderOptions { get; } public DayRangeRenderModel(CalendarRenderOptions calendarRenderOptions) { CalendarRenderOptions = calendarRenderOptions; for (var i = 0; i < CalendarRenderOptions.TotalDayCount; i++) { var representingDate = calendarRenderOptions.DateRange.StartDate.AddDays(i); var calendarDayModel = new CalendarDayModel(representingDate, calendarRenderOptions); RegisterCalendarDayEvents(calendarDayModel); CalendarDays.Add(calendarDayModel); } Period = new TimeRange(CalendarDays.First().RepresentingDate, CalendarDays.Last().RepresentingDate.AddDays(1)); // Create day headers based on culture info. for (var i = 0; i < 24; i++) { var representingDate = calendarRenderOptions.DateRange.StartDate.Date.AddHours(i); string dayHeader = calendarRenderOptions.CalendarSettings.DayHeaderDisplayType switch { DayHeaderDisplayType.TwelveHour => representingDate.ToString("h tt", calendarRenderOptions.CalendarSettings.CultureInfo), DayHeaderDisplayType.TwentyFourHour => representingDate.ToString("HH", calendarRenderOptions.CalendarSettings.CultureInfo), _ => "N/A" }; DayHeaders.Add(new DayHeaderRenderModel(dayHeader, calendarRenderOptions.CalendarSettings.HourHeight)); } } private void RegisterCalendarDayEvents(CalendarDayModel calendarDayModel) { calendarDayModel.EventsCollection.CalendarItemAdded += CalendarItemAdded; calendarDayModel.EventsCollection.CalendarItemRangeRemoved += CalendarItemRangeRemoved; calendarDayModel.EventsCollection.CalendarItemRemoved += CalendarItemRemoved; calendarDayModel.EventsCollection.CalendarItemRangeAdded += CalendarItemRangeAdded; } // TODO: These handlers have incorrect senders. They should be the CalendarDayModel. private void CalendarItemRangeAdded(object sender, List e) => CalendarDayEventCollectionUpdated?.Invoke(this, sender as CalendarDayModel); private void CalendarItemRemoved(object sender, ICalendarItem e) => CalendarDayEventCollectionUpdated?.Invoke(this, sender as CalendarDayModel); private void CalendarItemAdded(object sender, ICalendarItem e) => CalendarDayEventCollectionUpdated?.Invoke(this, sender as CalendarDayModel); private void CalendarItemRangeRemoved(object sender, List e) => CalendarDayEventCollectionUpdated?.Invoke(this, sender as CalendarDayModel); /// /// Unregisters all calendar item change listeners to draw the UI for calendar events. /// public void UnregisterAll() { foreach (var day in CalendarDays) { day.EventsCollection.CalendarItemRangeRemoved -= CalendarItemRangeRemoved; day.EventsCollection.CalendarItemRemoved -= CalendarItemRemoved; day.EventsCollection.CalendarItemRangeAdded -= CalendarItemRangeAdded; day.EventsCollection.CalendarItemAdded -= CalendarItemAdded; } } } }