using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using AutoMapper; using MoreLinq; using Nancy; using Sony.Filtr.AdminAPI.Utility; using Sony.Filtr.AdminAPI.ViewModels; using Sony.Filtr.Applications; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.Contracts.Entities.Buzz; using Sony.Filtr.Core.Buzz; using Sony.Filtr.Core.EditorialPlaylists; using Sony.Filtr.Playlists.Spotify; using Sony.Filtr.Utility.Extensions; namespace Sony.Filtr.AdminAPI.Modules.Stats { public class PlaylistStatsModule : BaseModule { private readonly EditorialPlaylistStatsManager _editorialPlaylistStatsManager; private readonly SpotifyPlaylistManager _spotifyPlaylistManager; public PlaylistStatsModule(EditorialPlaylistManager editorialPlaylistManager, BuzzManager buzzManager, EditorialPlaylistStatsManager editorialPlaylistStatsManager, ApplicationInstanceManager applicationInstanceManager, SpotifyPlaylistManager spotifyPlaylistManager) : base(applicationInstanceManager) { _editorialPlaylistStatsManager = editorialPlaylistStatsManager; _spotifyPlaylistManager = spotifyPlaylistManager; //Get["GetBuzzPlaylistsTrend", "/trends/{countryCode}/buzz/playlists/trend", true] = async (parameters, cx) => //{ // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var allBuzzImportUsers = buzzManager.GetBuzzImportUsers(CurrentApplication); // var playlists = await buzzManager.GetEditorialPlaylistsAsync(allBuzzImportUsers); // var stats = await GetStatsForAllDaysAsync(playlists, startDate, endDate); // return Response.AsJson(stats); //}; //Get["GetBuzzPlaylistsTrendExcel", "/trends/{countryCode}/buzz/playlists/trend/excel", true] = async (parameters, cx) => //{ // var allBuzzImportUsers = buzzManager.GetBuzzImportUsers(CurrentApplication); // var playlists = await buzzManager.GetEditorialPlaylistsAsync(allBuzzImportUsers); // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var stats = await GetStatsForAllDaysAsync(playlists, startDate, endDate); // var fileName = $"Buzz-trend-{(string)parameters.countryCode}-{ExcelUtility.GetFilenameDatePart()}.xlsx"; // return ExcelUtility.BuildExcelResponse(stats, fileName); //}; //Get["GetBuzzPlaylistsTrendForUser", "/trends/{countryCode}/buzz/users/{buzzId}/playlists/trend", true] = async (parameters, cx) => //{ // int buzzId; // if (!int.TryParse((string)parameters.buzzId, out buzzId)) // return HttpStatusCode.BadRequest; // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var buzzImportUser = buzzManager.GetBuzzImportUser(buzzId); // var playlists = await buzzManager.GetEditorialPlaylistsAsync(buzzImportUser); // var stats = await GetStatsForAllDaysAsync(playlists, startDate, endDate); // return Response.AsJson(stats); //}; //Get["GetBuzzPlaylistsTrendForUserExcel", "/trends/{countryCode}/buzz/users/{buzzId}/playlists/trend/excel", true] = async (parameters, cx) => //{ // int buzzId; // if (!int.TryParse((string)parameters.buzzId, out buzzId)) // return HttpStatusCode.BadRequest; // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var buzzImportUser = buzzManager.GetBuzzImportUser(buzzId); // var playlists = await buzzManager.GetEditorialPlaylistsAsync(buzzImportUser.AsEnumerable()); // var stats = await GetStatsForAllDaysAsync(playlists, startDate, endDate); // var fileName = $"Buzz-trend-{buzzImportUser.SpotifyUserName}-{ExcelUtility.GetFilenameDatePart()}.xlsx"; // return ExcelUtility.BuildExcelResponse(stats, fileName); //}; //Get["GetBuzzPlaylistForCompany", "/trends/{countryCode}/buzz/companies/{buzzCompany}/playlists/trend", true] = async (parameters, cx) => //{ // var buzzCompany = (string)parameters.buzzCompany; // var buzzImportUsers = GetBuzzImportUserByCompanyId(buzzManager, CurrentApplication, buzzCompany); // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var playlists = await buzzManager.GetEditorialPlaylistsAsync(buzzImportUsers); // var stats = await GetStatsForAllDaysAsync(playlists, startDate, endDate); // return Response.AsJson(stats); //}; Get["GetBuzzPlaylistForCompanyExcel", "/trends/{countryCode}/buzz/companies/{buzzCompany}/playlists/trend/excel", true] = async (parameters, cx) => { var buzzCompany = (string)parameters.buzzCompany; var buzzImportUsers = GetBuzzImportUserByCompanyId(buzzManager, CurrentApplication, buzzCompany); DateTime startDate; DateTime? endDate; ParseDates(out startDate, out endDate); var usernames = buzzImportUsers.Select(p => p.SpotifyUserName).Distinct().ToList(); var playlists = _spotifyPlaylistManager.GetPlaylistsForUsers(usernames); var playlistLinks = playlists.Select(p => new SpotifyLink(p.PlaylistUri)).ToList(); var stats = await GetStatsForAllDaysAsync(playlistLinks, startDate, endDate); var fileName = $"Buzz-trend-company-{buzzCompany}-{ExcelUtility.GetFilenameDatePart()}.xlsx"; return ExcelUtility.BuildExcelResponse(stats, fileName); }; //Get["GetAllPlaylistsTrend", "/trends/AllPlaylists/trend", true] = async (parameters, cx) => //{ // var allPlaylists = await editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(null, onlyActive: false); // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var stats = await GetStatsForAllDaysAsync(allPlaylists, startDate, endDate); // return Response.AsJson(stats); //}; //Get["GetAllPlaylistsTrendExcel", "/trends/AllPlaylists/trend/excel", true] = async (parameters, cx) => //{ // var allPlaylists = await editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(null, onlyActive: false); // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var stats = await GetStatsForAllDaysAsync(allPlaylists, startDate, endDate); // var fileName = $"AllPlaylists-trend-{ExcelUtility.GetFilenameDatePart()}.xlsx"; // return ExcelUtility.BuildExcelResponse(stats, fileName); //}; //Get["GetPlaylistPerCountryTrend", "/trends/playlistsPerCountry/{countryCode}/trend", true] = async (parameters, cx) => //{ // var countryCode = (string)parameters.countryCode; // if (string.IsNullOrWhiteSpace(countryCode)) // return HttpStatusCode.BadRequest; // var allPlaylists = await editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(null, onlyActive: false); // var playlistsForCountry = allPlaylists.DistinctBy(p => p.SpotifyLink.Uri).Where(p => p.CountryCode != null && p.CountryCode.Equals(countryCode, StringComparison.InvariantCultureIgnoreCase)); // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var stats = await GetStatsForAllDaysAsync(playlistsForCountry, startDate, endDate); // return Response.AsJson(stats); //}; //Get["GetPlaylistPerCountryTrendExcel", "/trends/playlistsPerCountry/{countryCode}/trend/excel", true] = async (parameters, cx) => //{ // var countryCode = (string)parameters.countryCode; // if (string.IsNullOrWhiteSpace(countryCode)) // return HttpStatusCode.BadRequest; // var allPlaylists = await editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(null, onlyActive: false); // var playlistsForCountry = allPlaylists.DistinctBy(p => p.SpotifyLink.Uri).Where(p => p.CountryCode != null && p.CountryCode.Equals(countryCode, StringComparison.InvariantCultureIgnoreCase)); // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var stats = await GetStatsForAllDaysAsync(playlistsForCountry, startDate, endDate); // var fileName = $"PlaylistsPerCountry-{countryCode}-trend-{ExcelUtility.GetFilenameDatePart()}.xlsx"; // return ExcelUtility.BuildExcelResponse(stats, fileName); //}; //Get["GetMarketPlaylistTrends", "/trends/{countryCode}/trend", true] = async (parameters, cx) => //{ // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var playlists = await editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(CurrentApplication, onlyActive: false); // var stats = await editorialPlaylistStatsManager.GetPlaylistStatsAsync(playlists, startDate, endDate); // var playlistsGrouping = stats.ToDictionary(k => k.Playlist.ID, v => v.Stats.OrderBy(s=> s.Date).ToDictionary(ki => ki.Date, iv => iv.Subscribers)); // return Response.AsJson(playlistsGrouping); //}; //Get["GetSelectedPlaylistsTrend", "/playlists/trend", true] = async (parameters, cx) => //{ // var playlistIds = ((string)Request.Query.playlistId).Split(',').Select(p=> int.Parse(p)); // ConcurrentBag playlists = new ConcurrentBag(); // await playlistIds.ForEachAsync(1, async playlistId => // { // var playlist = await editorialPlaylistManager.GetEditorialPlaylistAsync(playlistId); // playlists.Add(playlist); // }); // DateTime startDate; // DateTime? endDate; // ParseDates(out startDate, out endDate); // var stats = await GetStatsForAllDaysAsync(playlists, startDate, endDate); // return Response.AsJson(stats); //}; Get["GetSelectedPlaylistsTrendExcel", "/playlists/trend/excel", true] = async (parameters, cx) => { var playlistIds = ((string)Request.Query.playlistId).Split(',').ToList(); int playlistIdInt; var playlistId = playlistIds.First(); List parsedPlaylistIds = new List(); DateTime startDate; DateTime? endDate; ParseDates(out startDate, out endDate); foreach (var id in playlistIds) { if (int.TryParse(id, out playlistIdInt)) { var editorialPlaylist = await editorialPlaylistManager.GetEditorialPlaylistAsync(playlistIdInt); var playlistIdString = editorialPlaylist.SpotifyLinkUri; var regex = new Regex(@"[^:]+$"); playlistId = regex.Match(playlistIdString).ToString(); parsedPlaylistIds.Add(playlistId); } else { parsedPlaylistIds.Add(id); } } var playlistLinks = parsedPlaylistIds.Select(p => new SpotifyLink($"spotify:playlist:{p}")).ToList(); var stats = await GetStatsForAllDaysAsync(playlistLinks, startDate, endDate); var fileName = $"Playlists-{ExcelUtility.GetFilenameDatePart()}.xlsx"; if (playlistIds.Count() == 1) { var playlist = _spotifyPlaylistManager.GetPlaylistById(playlistId); fileName = $"Playlist-{playlist.Name}-{ExcelUtility.GetFilenameDatePart()}.xlsx"; } return ExcelUtility.BuildExcelResponse(stats, fileName); }; } private async Task> GetStatsForAllDaysAsync(List playlistLinks, DateTime startDate, DateTime? endDate) { var tempEndDate = endDate ?? DateTime.Today.Date; var realStatistics = await _editorialPlaylistStatsManager.GetCombinedEditorialPlaylistSubscriptionStatisticAsync(playlistLinks, startDate, endDate); var stats = new Dictionary(); if (realStatistics.Any()) { startDate = realStatistics.Keys.Min(); for (DateTime date = startDate; date.Date <= tempEndDate.Date; date = date.AddDays(1)) { if (realStatistics.ContainsKey(date.Date)) stats[date.Date] = realStatistics[date.Date]; else stats[date.Date] = null; } } return stats; } private List GetBuzzImportUserByCompanyId(BuzzManager buzzManager, Application app, string companyId) { var buzzImportUsers = buzzManager.GetBuzzImportUsers(app); var companyUsers = buzzImportUsers.Where(b => Mapper.Map(b).CompanyId.Equals(companyId, StringComparison.CurrentCultureIgnoreCase)) .ToList(); return companyUsers; } private void ParseDates(out DateTime startDate, out DateTime? endDate) { if (!DateTime.TryParse((string) Request.Query.startDate, out startDate)) startDate = new DateTime(2012, 01, 01); DateTime tempEndDate; if (DateTime.TryParse((string) Request.Query.endDate, out tempEndDate)) { endDate = tempEndDate; } else { endDate = null; } } } }