Public Access
39 lines
1.1 KiB
C#
39 lines
1.1 KiB
C#
namespace MeetingAssistant.MeetingNotes;
|
|
|
|
internal static class OutlookMeetingCandidateSelector
|
|
{
|
|
private static readonly TimeSpan MinimumRemainingOverlap = TimeSpan.FromMinutes(5);
|
|
private static readonly TimeSpan UpcomingStartWindow = TimeSpan.FromMinutes(5);
|
|
|
|
public static T? Select<T>(
|
|
IReadOnlyList<T> candidates,
|
|
DateTime startedAt,
|
|
Func<T, DateTime> getStart,
|
|
Func<T, DateTime> getEnd)
|
|
where T : class
|
|
{
|
|
var goodOverlaps = candidates
|
|
.Where(candidate =>
|
|
getStart(candidate) <= startedAt &&
|
|
getEnd(candidate) >= startedAt.Add(MinimumRemainingOverlap))
|
|
.ToList();
|
|
if (goodOverlaps.Count == 1)
|
|
{
|
|
return goodOverlaps[0];
|
|
}
|
|
|
|
if (goodOverlaps.Count > 1)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
var upcoming = candidates
|
|
.Where(candidate =>
|
|
getStart(candidate) > startedAt &&
|
|
getStart(candidate) <= startedAt.Add(UpcomingStartWindow))
|
|
.OrderBy(getStart)
|
|
.ToList();
|
|
return upcoming.Count == 1 ? upcoming[0] : null;
|
|
}
|
|
}
|