using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Media.Imaging; using Comal.Classes; using Geocoding; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; namespace PRSDesktop { public class AssignmentAppointment : CalendarAppointment { public CalendarAssignmentType AssignmentType { get; } public override TimeSpan StartTime { get => AssignmentType switch { CalendarAssignmentType.Booked => Model.Booked.Start, CalendarAssignmentType.Actual => Model.Actual.Start, _ => Model.EffectiveStartTime() }; set { switch (AssignmentType) { case CalendarAssignmentType.Automatic: case CalendarAssignmentType.Actual: Model.Actual.Start = value; break; case CalendarAssignmentType.Booked: Model.Booked.Start = value; break; } OnUpdate?.Invoke(); } } public override TimeSpan EndTime { get => AssignmentType switch { CalendarAssignmentType.Booked => Model.Booked.Finish, CalendarAssignmentType.Actual => Model.Actual.Finish, _ => Model.EffectiveFinishTime() }; set { switch (AssignmentType) { case CalendarAssignmentType.Automatic: case CalendarAssignmentType.Actual: Model.Actual.Finish = value; break; case CalendarAssignmentType.Booked: Model.Booked.Finish = value; break; } OnUpdate?.Invoke(); } } public override bool CanAdjust => true; public override DateTime Date { get => Model.Date; set { Model.Date = value; OnUpdate?.Invoke(); } } public override Employee? Employee { get => base.Employee; set { base.Employee = value; Model.EmployeeLink.ID = value?.ID ?? Guid.Empty; OnUpdate?.Invoke(); } } public event Action? OnUpdate; public AssignmentAppointment(Assignment model, Employee employee, CalendarAssignmentType type) : base(model, employee, x => x.ActivityLink.Color) { AssignmentType = type; Notes = Model.Description; Subject = GetSubject(); Image = GetImage(); WeakEventManager.AddHandler(model, nameof(Assignment.PropertyChanged), Assignment_Changed); } private static Column[] SubjectColumns = [ new(x => x.Number), new(x => x.JobLink.JobNumber), new(x => x.ITP.Code), new(x => x.Task.Number), new(x => x.Meeting.Link.Number), new(x => x.Title), ]; private string GetSubject() { var subject = new List() { Model.Number.ToString() }; if (Model.JobLink.ID != Guid.Empty) subject.Add( Model.ITP.ID != Guid.Empty ? $"{Model.JobLink.JobNumber}-{Model.ITP.Code}" : $"{Model.JobLink.JobNumber}" ); if (Model.Task.ID != Guid.Empty) subject.Add($"Task {Model.Task.Number}"); if (Model.Meeting.Link.ID != Guid.Empty) subject.Add($"Mtg {Model.Meeting.Link.Number}"); subject.Add(Model.Title ?? ""); return string.Join(" ", subject); } private static Column[] ImageColumns = [ new(x => x.Completed), new(x => x.Delivery.ID), new(x => x.Meeting.Link.ID), ]; private BitmapImage? GetImage() { var images = new List(); if (!Model.Completed.IsEmpty()) images.Add(Resources.tick_sml.Resize(32,32)); if (Model.Delivery.ID != Guid.Empty) images.Add(Resources.box_sml.Resize(32,32)); if (Model.Meeting.Link.ID != Guid.Empty) images.Add(Resources.employees.Resize(32,32)); return ImageUtils.MergeBitmaps(images, 10)?.AsBitmapImage(); } private static Column[] StartColumns = [ new(x => x.Booked.Start), new(x => x.Actual.Start), ]; private static Column[] FinishColumns = [ new(x => x.Booked.Finish), new(x => x.Actual.Finish), ]; private void Assignment_Changed(object? sender, PropertyChangedEventArgs e) { if(StartColumns.Any(x => x.Property == e.PropertyName)) { OnPropertyChanged(nameof(StartTime)); } else if(FinishColumns.Any(x => x.Property == e.PropertyName)) { OnPropertyChanged(nameof(EndTime)); } else if(e.PropertyName == nameof(Assignment.Date)) { OnPropertyChanged(nameof(Date)); } else if(e.PropertyName == $"{nameof(Assignment.EmployeeLink)}.{nameof(Employee.ID)}") { EmployeeChanged?.Invoke(this, new()); } if(SubjectColumns.Any(x => x.Property == e.PropertyName)) { Subject = GetSubject(); OnPropertyChanged(nameof(Subject)); } else if(e.PropertyName == nameof(Assignment.Description)) { Notes = Model.Description; OnPropertyChanged(nameof(Notes)); } else if(e.PropertyName == $"{nameof(Assignment.ActivityLink)}.{nameof(Assignment.ActivityLink.Color)}") { UpdateColour(); OnPropertyChanged(nameof(Background)); OnPropertyChanged(nameof(Foreground)); } if(ImageColumns.Any(x => x.Property == e.PropertyName)) { Image = GetImage(); OnPropertyChanged(nameof(Image)); } } public event EventHandler? EmployeeChanged; } }