using System; using System.Diagnostics; using Itenso.TimePeriod; using SQLite; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; namespace Wino.Core.Domain.Entities.Calendar; [DebuggerDisplay("{Title} ({StartDate} - {EndDate})")] public class CalendarItem : ICalendarItem { [PrimaryKey] public Guid Id { get; set; } public string RemoteEventId { get; set; } public string Title { get; set; } public string Description { get; set; } public string Location { get; set; } public string StartTimeOffset { get; set; } public string EndTimeOffset { get; set; } public DateTimeOffset StartDateTimeOffset => DateTimeOffset.Parse(StartTimeOffset); public DateTimeOffset EndDateTimeOffsete => DateTimeOffset.Parse(EndTimeOffset); public DateTime StartDate => StartDateTimeOffset.DateTime;//TimeZoneInfo.ConvertTime(StartDateTimeOffset, TimeZoneInfo.Local).DateTime; public DateTime EndDate => EndDateTimeOffsete.DateTime;// TimeZoneInfo.ConvertTime(, TimeZoneInfo.Local).DateTime; private ITimePeriod _period; public ITimePeriod Period { get { // Period must be loaded by user's current UI culture based on StartDateTimeOffset and EndDateTimeOffset // Get the time zone corresponding to the current culture _period ??= new TimeRange(StartDate, EndDate); return _period; } } /// /// Events that starts at midnight and ends at midnight are considered all-day events. /// public bool IsAllDayEvent { get { return StartDate.TimeOfDay == TimeSpan.Zero && EndDate.TimeOfDay == TimeSpan.Zero; } } /// /// Events that are either an exceptional instance of a recurring event or occurrences. /// IsOccurrence is used to display occurrence instances of parent recurring events. /// IsOccurrence == false && IsRecurringChild == true => exceptional single instance. /// public bool IsRecurringChild { get { return RecurringCalendarItemId != null; } } /// /// Events that are either an exceptional instance of a recurring event or occurrences. /// public bool IsRecurringEvent => IsRecurringChild || IsRecurringParent; /// /// Events that are the master event definition of recurrence events. /// public bool IsRecurringParent { get { return !string.IsNullOrEmpty(Recurrence) && RecurringCalendarItemId == null; } } /// /// Events that are not all-day events and last more than one day are considered multi-day events. /// public bool IsMultiDayEvent { get { return Period.Duration.TotalDays >= 1 && !IsAllDayEvent; } } public double DurationInSeconds => Period.Duration.TotalSeconds; public string Recurrence { get; set; } public string OrganizerDisplayName { get; set; } public string OrganizerEmail { get; set; } /// /// The id of the parent calendar item of the recurring event. /// Exceptional instances are stored as a separate calendar item. /// This makes the calendar item a child of the recurring event. /// public Guid? RecurringCalendarItemId { get; set; } /// /// Indicates read-only events. Default is false. /// public bool IsLocked { get; set; } /// /// Hidden events must not be displayed to the user. /// This usually happens when a child instance of recurring parent is cancelled after creation. /// public bool IsHidden { get; set; } // TODO public string CustomEventColorHex { get; set; } public string HtmlLink { get; set; } public CalendarItemStatus Status { get; set; } public CalendarItemVisibility Visibility { get; set; } public DateTimeOffset CreatedAt { get; set; } public DateTimeOffset UpdatedAt { get; set; } public Guid CalendarId { get; set; } [Ignore] public IAccountCalendar AssignedCalendar { get; set; } /// /// Whether this item does not really exist in the database or not. /// These are used to display occurrence instances of parent recurring events. /// [Ignore] public bool IsOccurrence { get; set; } /// /// Id to load information related to this event. /// Occurrences tracked by the parent recurring event if they are not exceptional instances. /// Recurring children here are exceptional instances. They have their own info in the database including Id. /// public Guid EventTrackingId => IsOccurrence ? RecurringCalendarItemId.Value : Id; public CalendarItem CreateRecurrence(DateTimeOffset startDateOffset, DateTimeOffset endDateOffset) { // Create a copy with the new start date and duration return new CalendarItem { Id = Guid.NewGuid(), Title = Title, Description = Description, Location = Location, StartTimeOffset = startDateOffset.ToString("o"), EndTimeOffset = endDateOffset.ToString("o"), Recurrence = Recurrence, OrganizerDisplayName = OrganizerDisplayName, OrganizerEmail = OrganizerEmail, RecurringCalendarItemId = Id, AssignedCalendar = AssignedCalendar, CalendarId = CalendarId, CreatedAt = CreatedAt, UpdatedAt = UpdatedAt, Visibility = Visibility, Status = Status, CustomEventColorHex = CustomEventColorHex, HtmlLink = HtmlLink, RemoteEventId = RemoteEventId, IsHidden = IsHidden, IsLocked = IsLocked, IsOccurrence = true }; } }