public async System.Threading.Tasks.Task <AbstractChartDto> BuildChart(string p_chartUrl, List <KeyValuePair <string, string> > p_chartHeaders, IChartParser p_chartParser)
        {
            AbstractChartDto retChart = new ChartDto();


            if (p_chartUrl == null || p_chartUrl == "")
            {
                throw (new ArgumentException("Missing chart url"));
            }

            if (p_chartHeaders == null)
            {
                throw (new ArgumentException("Missing chart request headers"));
            }

            if (p_chartParser == null)
            {
                throw (new ArgumentException("Missing chart parser"));
            }



            using (var client = new HttpClient())
            {
                try
                {
                    foreach (var item in p_chartHeaders)
                    {
                        client.DefaultRequestHeaders.Add(item.Key, item.Value);
                    }


                    var response = await client.GetAsync(p_chartUrl);

                    response.EnsureSuccessStatusCode();


                    var stringResponse = await response.Content.ReadAsStringAsync();


                    if (p_chartParser.AnalyzeRawChartData(stringResponse))
                    {
                        retChart = p_chartParser.ParseChart(stringResponse);
                    }



                    //link chart with youtube ids
                    foreach (var item in retChart.SongsList)
                    {
                        //loop and assign youtube ids
                        item.YouTubeId = await _youtubeSearch.SearchFirstByKeyword(item.Artist + "-" + item.Name);

                        Task.Delay(100);
                    }



                    if (retChart.SongNum > 0)
                    {
                        //save chart to data storage
                        _dbChartManager.Add(retChart);
                    }
                }
                catch (HttpRequestException ex)
                {
                    // record error to log
                }
            }

            return(retChart);
        }