using System.Linq.Expressions;
using FoodsharingSiegen.Contracts.Entity;
using FoodsharingSiegen.Contracts.Model;

namespace FoodsharingSiegen.Shared.Helper
{
    public static class FilterHelper
    {
        #region Public Method ApplyFilter

        /// <summary>
        ///     Filters the given prospect list based on the provided filter criteria.
        /// </summary>
        /// <param name="prospectList">
        ///     The list of prospects to be filtered. Can be null.
        /// </param>
        /// <param name="filter">
        ///     The filter criteria used to narrow down the prospect list.
        /// </param>
        /// <returns>
        ///     A filtered list of prospects that meet the criteria specified in the filter.
        /// </returns>
        public static List<Prospect> ApplyFilter(this List<Prospect>? 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<Prospect, bool> q1 = x => x.Interactions.Any() && x.Interactions.All(i => DateTime.Now - i.Date > TimeSpan.FromDays(days));
                Func<Prospect, bool> q2 = x => DateTime.Now - x.Created > TimeSpan.FromDays(days);
                
                filterListQ = filterListQ.Where(x => q1(x) && q2(x));
            }

            return filterListQ.ToList();
        }

        #endregion
    }
}