/// <summary>
        ///     You can retrieve the entire collection of tracks available in Beats Music.
        /// </summary>
        /// <param name="offset">A zero-based integer offset into the results. Default 0</param>
        /// <param name="limit">
        ///     Specifies the maximum number of records to retrieve. The number of results returned will be less
        ///     than or equal to this value. No results are returned if it is set to zero or less. The maximum permitted value is
        ///     200. If a value higher than 200 is specified, no more 200 results will be returned. Default 20.
        /// </param>
        /// <param name="tracksOrderByData">Indicates how the results set should be sorted.  Values (default is TrackPosition)</param>
        /// <returns></returns>
        public async Task<MultipleRootObject<TrackData>> GetTracks(int offset = 0, int limit = 20,
            TracksOrderByData tracksOrderByData = TracksOrderByData.PopularityDesc)
        {
            ValidateIdOffsetLimit(offset, limit);
            var methodParams = new List<KeyValuePair<string, string>>();
            methodParams = AddOffsetAndLimitParams(methodParams, offset, limit);
            methodParams = AddOrderByParam<TracksOrderByData>(tracksOrderByData, methodParams);

            return await BeatsMusicManager.GetMultipleParsedResult<TrackData>("tracks", methodParams);
        }
        /// <summary>
        /// Gets a list of tracks on which the given artist was credited (uses the same options and response as the tracks collection)
        /// </summary>
        /// <param name="artistId">The unique ID for the artist.</param>
        /// <param name="offset">Integer offset into results, 0 based. Defaults to 0.</param>
        /// <param name="limit">Specifies the maximum number of records to retrieve. You are guaranteed to get at most this number of results, but you may get fewer. If set to zero or less, returns nothing. Maximum value is 200 (i.e., if greater than 200, returns only 200). If not supplied, defaults to 20.</param>
        /// <param name="tracksRef">An array of referenced objects to include in the response. Only the requested ref collections will be returned. Default is to return all refs. </param>
        /// <param name="orderByData">Indicates how the results set should be sorted.Default value is TrackPosition</param>
        /// <param name="genereIdsFilters">Array of filter operations to apply. Valid filters: genres</param>
        /// <param name="streamabilityFilters">Array of streamability filter operations to apply. Streamability refers to whether an entity, such as a track or album, can be streamed.</param>
        /// <returns></returns>
        public async Task<MultipleRootObject<TrackData>> GetTracksByArtist(string artistId, int offset = 0,
            int limit = 20, TracksRefType tracksRef = TracksRefType.AllRefs,
            TracksOrderByData orderByData = TracksOrderByData.TrackPosition,
            string[] genereIdsFilters = null, StreamabilityFilters streamabilityFilters = null)
        {
            Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(artistId), "artistId field is null");
            this.ValidateIdOffsetLimit(offset, limit);

            var dataParams = new List<KeyValuePair<string, string>>();
            dataParams = AddOffsetAndLimitParams(dataParams, offset, limit);
            dataParams = this.AddFlagedEnumValues<TracksRefType>(tracksRef, dataParams);

            dataParams = AddOrderByParam<TracksOrderByData>(orderByData, dataParams);

            if (genereIdsFilters != null && genereIdsFilters.Any())
            {
                foreach (string genereId in genereIdsFilters)
                {
                    dataParams.Add(new KeyValuePair<string, string>("filters:", string.Format("genre:{0}", genereId)));
                }
            }

            this.AddStreamabilityFilterParams(streamabilityFilters, dataParams);

            return
                await
                    BeatsMusicManager.GetMultipleParsedResult<TrackData>(string.Format("artists/{0}/tracks", artistId),
                        dataParams);
        }