/// <summary>
        /// Creates a query for Spotify Search-method
        /// based on search-parameters to be both included and
        /// excluded from result.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns>Query to be appended to the search-uri</returns>
        private string CreateQuery(SpotifyFilter filter)
        {
            StringBuilder q       = new StringBuilder("");
            var           filters = new Dictionary <string, string>();

            filter.IncludeFilters.ForEach(flt =>
            {
                flt.Type = flt.Type.ToLower();
                if (!filters.ContainsKey(flt.Type))
                {
                    filters.Add(flt.Type, flt.Keyword);
                }
                else
                {
                    filters[flt.Type] += $" OR {flt.Keyword}";
                }
            });

            filter.ExcludeFilters?.ForEach(flt =>
            {
                flt.Type = flt.Type.ToLower();
                if (!filters.ContainsKey(flt.Type))
                {
                    filters.Add(flt.Type, $" NOT {flt.Keyword}");
                }
                else
                {
                    filters[flt.Type] += $" NOT {flt.Keyword}";
                }
            });

            filters.Keys.ToList().ForEach(f =>
            {
                q.Append($"{f}:{filters[f]} ");
            });

            if (!filter.AllDates)
            {
                if (filter.From > 1800)
                {
                    q.Append($" year:{filter.From}");
                    if (filter.To > filter.From)
                    {
                        q.Append($"-{filter.From}");
                    }
                }
                else
                {
                    q.Append($"tag:new");
                }
            }

            return(q.ToString().TrimEnd(' '));
        }
        public async Task <RequestResult> GetDataSpotify()
        {
            var result = new RequestResult(StatusResult.Success);

            try
            {
                var autorization = await GetAutorization();

                if (autorization != null)
                {
                    var    generosList = _generoService.GetAllGenero();
                    var    albumList   = new List <Album>();
                    Random numRandom   = new Random();

                    using (var client = _httpClientFactory.CreateClient("BlueDiscosOnlineClient"))
                    {
                        string baseURL = Configuration.GetSection("SpotifyConnection:BaseURL").Value;
                        client.BaseAddress = new Uri(baseURL);
                        var searchAlbumLimite = Configuration.GetSection("SpotifyConnection:SearchAlbumLimite").Value;
                        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", autorization.Access_token);

                        foreach (var item in generosList)
                        {
                            var spotifyFilter = new SpotifyFilter();
                            var url           = client.BaseAddress + "recommendations?limit=" + searchAlbumLimite + "&seed_genres=" + item.Descricao;

                            var response = await client.GetAsync(url);

                            response.EnsureSuccessStatusCode();
                            if (response.IsSuccessStatusCode)
                            {
                                string content = await response.Content.ReadAsStringAsync();

                                if (content != null)
                                {
                                    spotifyFilter = JsonConvert.DeserializeObject <SpotifyFilter>(content);
                                }
                            }

                            foreach (var album in spotifyFilter.Tracks)
                            {
                                albumList.Add(new Album {
                                    Nome = album.Album.Name, Artista = album.Artists.FirstOrDefault().Name, GeneroId = item.Id, Valor = Convert.ToDecimal(numRandom.Next(1, 99) + Math.Round(numRandom.NextDouble(), 2))
                                });
                            }
                        }
                    }

                    if (albumList.Count() > 0)
                    {
                        using (var unitOfWork = _unitOfWorkFactory.CreateUnitOfWork())
                        {
                            foreach (var album in albumList)
                            {
                                unitOfWork.Repository.Add(album);
                            }

                            await unitOfWork.Commit();
                        }
                    }

                    result.Data = albumList;
                }
            }
            catch (Exception)
            {
                result.Status = StatusResult.Danger;
            }

            return(result);
        }
        /// <summary>
        /// Create query based on filter and return result in form of Tracks
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public async Task <SearchTrackCollection> SearchTracks(SpotifyFilter filter)
        {
            var tracks = await apiClient.SearchAsync <SearchTrackResponse>(filter.Type.ToString(), CreateQuery(filter));

            return(tracks.Tracks);
        }
        /// <summary>
        /// Create query based on filter and return result in form of Albums
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public async Task <SearchAlbumCollection> SearchAlbums(SpotifyFilter filter)
        {
            var albums = await apiClient.SearchAsync <SearchAlbumResponse>(filter.Type.ToString(), CreateQuery(filter));

            return(albums.Albums);
        }
        /// <summary>
        /// Create query based on filter and return result in form of Artists
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public async Task <SearchArtistCollection> SearchArtists(SpotifyFilter filter)
        {
            var artists = await apiClient.SearchAsync <SearchArtistResponse>(filter.Type.ToString(), CreateQuery(filter));

            return(artists.Artists);
        }
        public async Task <SearchTrackCollection> SearchTracks([FromBody] SpotifyFilter filter)
        {
            var tracks = await spotifySvc.SearchTracks(filter);

            return(tracks);
        }
        public async Task <SearchArtistCollection> SearchArtists([FromBody] SpotifyFilter filter)
        {
            var artists = await spotifySvc.SearchArtists(filter);

            return(artists);
        }
        public async Task <SearchAlbumCollection> SearchAlbums([FromBody] SpotifyFilter filter)
        {
            var albums = await spotifySvc.SearchAlbums(filter);

            return(albums);
        }