using System.ComponentModel.DataAnnotations; namespace Core.Entities; public class Team { public int Id { get; set; } [Required] [Display(Name = "Team Name")] public string Name { get; set; } public EventDefinition Event { get; set; } public List Students { get; set; } = []; public Student? Captain { get; set; } [Display(Name = "Team Id")] public string? TeamId { get; set; } //public string? RegionalTimeSlot { get; set; } // public Tuple? RegionalTimeSlotObj //{ // get // { // if (string.IsNullOrEmpty(RegionalTimeSlot)) // return null; // var times = Regex.Matches(RegionalTimeSlot, @"(.*)\s*-\s*(.*)"); // if (times.Count == 0) // return Tuple.Create(P(RegionalTimeSlot), (DateTime?)null); // var match = times[0]; // if (!match.Success) // return Tuple.Create(P(RegionalTimeSlot), (DateTime?)null); // return Tuple.Create(P(match.Groups[1].Value), (DateTime?)P(match.Groups[2].Value)); // return null; // } //} private DateTime P(string s) { var dt = DateTime.Parse(s); if (dt.TimeOfDay < TimeSpan.FromHours(7)) return dt + TimeSpan.FromHours(12); return dt; } public virtual Team CloneWithOmittedStudents(IEnumerable studentsToOmit) { var studentsToOmitList = studentsToOmit.ToList(); var omittedStudents = Students.Where(studentsToOmitList.Contains).ToList(); if (!omittedStudents.Any()) return new Team{Captain = Captain, Event = Event, Students = Students.ToList(), TeamId = Name}; var remainingStudents = Students.Where(s => !studentsToOmitList.Contains(s)).ToList(); return new PartialTeam { Name = Name, Event = Event, Students = remainingStudents, OmittedStudents = omittedStudents}; } public Team Clone() => CloneWithOmittedStudents([]); public static int GetStudentTeamOverlapCount(IList[] timeSlots) { return timeSlots.Sum(GetStudentTeamOverlapCount); } private static int GetStudentTeamOverlapCount(IList timeSlot) { return GetStudentTeamOverlaps(timeSlot).Count(); } public static IEnumerable>> GetStudentTeamOverlaps(IList timeSlot) { return from s in timeSlot.SelectMany(ts => ts.Students).Distinct() group s by timeSlot.Where(t => t.Students.Contains(s)) into gs where gs.Key.Count() > 1 select Tuple.Create(gs.First(), gs.Key); } public override string ToString() { return Name; } public string ToStringWithIndividualAndRegional() { var ind = Event.EventFormat is EventFormat.Individual ? " (Ind.)" : string.Empty; var regional= Event.RegionalEvent ? " (Reg.)" : string.Empty; //var regional= Event.RegionalEvent ? " (Reg.)" : string.Empty; var eventAttributes = Event.EventAttributes(); return string.IsNullOrEmpty(eventAttributes) ? Name : Name + " (" + eventAttributes + ")"; } }