using Sony.Filtr.AdminAPI.Modules.AnalyzePlaylist.ViewModels; using Sony.Filtr.Playlists.Spotify.Model.History; using System; using System.Collections.Generic; using System.Linq; namespace Sony.Filtr.AdminAPI.Extensions { public static class TrackPositionExtensions { public static void CalculateTrendAndIsEntry(this IEnumerable trendHistory, IEnumerable trackIsrcGroup) { if (trendHistory == null || !trendHistory.Any()) { return; } SonyTrackViewModel topPositionTrack = trackIsrcGroup.OrderBy(g => g.Position).First(); Tuple trend = trendHistory.CalculateTrend(topPositionTrack.Position); if (trend != null) { topPositionTrack.PositionChange = trend.Item1; topPositionTrack.PositionChangeDate = (trend.Item2 > DateTime.Now.Date ? DateTime.Now.Date : trend.Item2); } topPositionTrack.IsEntry = trendHistory.IsEntry(topPositionTrack.Position, topPositionTrack.AddedDate.HasValue ? topPositionTrack.AddedDate.Value : DateTime.Now); } public static Tuple CalculateTrend(this IEnumerable trendHistory, int currentTrackPosition) { if (trendHistory == null || !trendHistory.Any()) { return null; } HistoricTrackPosition previousPosition = trendHistory.GetPreviousPosition(currentTrackPosition); return previousPosition == null ? null : new Tuple(currentTrackPosition - previousPosition.Position, previousPosition.Date.AddDays(1)); } public static bool IsEntry(this IEnumerable trendHistory, int currentTrackPosition, DateTime currentDate) { if(trendHistory == null) { return false; } HistoricTrackPosition previousPosition = trendHistory.GetPreviousPosition(currentTrackPosition); return previousPosition == null ? true : previousPosition.Position == currentTrackPosition && previousPosition.Date.Date == currentDate.Date; } private static HistoricTrackPosition GetPreviousPosition(this IEnumerable trendHistory, int currentTrackPosition) { return trendHistory .GroupBy(th => th.Date) .OrderByDescending(g => g.Key) .Select(g => g.Aggregate((HistoricTrackPosition)null, (min, current) => (min == null || min.Position > current.Position) ? current : min)) .FirstOrDefault(dateMin => dateMin.Position != currentTrackPosition); } } }