using System.Linq.Expressions;
using FoodsharingSiegen.Contracts.Entity;
using FoodsharingSiegen.Contracts.Model;
namespace FoodsharingSiegen.Shared.Helper
{
public static class FilterHelper
{
#region Public Method ApplyFilter
///
/// Filters the given prospect list based on the provided filter criteria.
///
///
/// The list of prospects to be filtered. Can be null.
///
///
/// The filter criteria used to narrow down the prospect list.
///
///
/// A filtered list of prospects that meet the criteria specified in the filter.
///
public static List ApplyFilter(this List? prospectList, ProspectFilter filter)
{
if (prospectList == null) return [];
var filterListQ = prospectList.AsQueryable();
if (!string.IsNullOrWhiteSpace(filter.Text))
filterListQ = filterListQ
.Where(x =>
x.Name.Contains(filter.Text, StringComparison.OrdinalIgnoreCase) ||
(!string.IsNullOrWhiteSpace(x.Memo) && x.Memo.Contains(filter.Text, StringComparison.OrdinalIgnoreCase) == true) ||
x.FsId.ToString().Contains(filter.Text, StringComparison.OrdinalIgnoreCase)).AsQueryable();
if (filter.WithoutStepInBriefing)
filterListQ = filterListQ.Where(x => x.Interactions.All(i => i.Type != InteractionType.StepInBriefing));
if (filter.WithoutIdCheck)
filterListQ = filterListQ.Where(x => x.Interactions.All(i => i.Type != InteractionType.IdCheck));
if (filter.NoActivity)
{
var days = 180; // Half year
Func q1 = x => x.Interactions.Any() && x.Interactions.All(i => DateTime.Now - i.Date > TimeSpan.FromDays(days));
Func q2 = x => DateTime.Now - x.Created > TimeSpan.FromDays(days);
filterListQ = filterListQ.Where(x => q1(x) && q2(x));
}
return filterListQ.ToList();
}
#endregion
}
}