public YCustomReport Get(YReportInitializer initializer)
        {
            WebClient wc = new WebClient();

            wc.Headers.Add(
                "Authorization",
                $"OAuth {YCommonCredentialManager.Get(new YRestCredentialInitializer(config.TokensJsonPath)).AccessToken}"
                );

            string url = $"{ config.ApiUrl}stat/v1/data?ids={initializer.Counter.Id.ToString()}" +
                         $"&date1={initializer.DateStart.ToString("yyyy-MM-dd")}" +
                         $"&date2={initializer.DateEnd.ToString("yyyy-MM-dd")}" +
                         $"&metrics={string.Join(",", initializer.Metrics.Select(x => x.Name).ToArray())}" +
                         $"&dimensions={string.Join(",", initializer.Dimensions.Select(x => x.Name).ToArray())}";
            string             result       = wc.DownloadString(url);
            ReportRestResponse apiReport    = JsonConvert.DeserializeObject <ReportRestResponse>(result);
            YCustomReport      customReport = new YCustomReport(initializer)
            {
                Rows = new List <CustomReportRow>()
            };

            foreach (var row in apiReport.Rows)
            {
                List <CustomReportCell> reportRowCells = new List <CustomReportCell>();
                for (int i = 0; i < apiReport.Request.Dimensions.Length; i++)
                {
                    reportRowCells.Add(new YCustomDimensionValued(apiReport.Request.Dimensions[i], row.Dimensions[i].Name));
                }
                for (int i = 0; i < apiReport.Request.Metrics.Length; i++)
                {
                    reportRowCells.Add(new YCustomMetricValued(apiReport.Request.Metrics[i], row.Metrics[i].ToString()));
                }
                customReport.Rows.Add(new CustomReportRow(reportRowCells));
            }
            return(customReport);
        }
        public YDCustomReport Get(YDCustomReportInitializer initializer)
        {
            try
            {
                YCommonCredentialManager cm = new YCommonCredentialManager();
                var credentials             = cm.Get(new YRestCredentialInitializer(initializer.Config.CredentialsJsonPath));

                RestClient  rc = new RestClient();
                RestRequest rr = new RestRequest(Constants.RestApi5Url, Method.POST);
                rr.AddHeader("Authorization", $"Bearer {credentials.AccessToken}");
                rr.AddHeader("processingMode", "auto");
                rr.AddHeader("returnMoneyInMicros", "true");
                rr.AddHeader("skipReportHeader", "true");
                rr.AddHeader("skipReportSummary", "true");


                WebClient wc = new WebClient();
                wc.Headers[HttpRequestHeader.Authorization] = $"Bearer {credentials.AccessToken}";
                wc.Headers["processingMode"]      = "auto";
                wc.Headers["returnMoneyInMicros"] = "true";
                wc.Headers["skipReportHeader"]    = "true";
                wc.Headers["skipReportSummary"]   = "true";

                rest.YDRestApi5ReportRequest apiRequest = new rest.YDRestApi5ReportRequest
                {
                    Params = new rest.YDRestApi5ReportRequestParams
                    {
                        SelectionCriteria = new rest.YDRestApi5ReportRequestParamsSelectionCriteria
                        {
                            DateFrom = initializer.DateFrom.ToString(Constants.RestApi5DateFormat),
                            DateTo   = initializer.DateTo.ToString(Constants.RestApi5DateFormat)
                        },
                        FieldNames = initializer.Columns.Select(x => x.Value.Name).ToArray(),
                        IncludeVAT = initializer.IncludeVAT,
                        ReportType = initializer.ReportType
                    }
                };
                Console.WriteLine("ReportName: " + apiRequest.Params.ReportName);
                var body = JsonConvert.SerializeObject(apiRequest);
                rr.AddParameter("application/json", body, ParameterType.RequestBody);
                //wc.UploadString(Constants.RestApi5Url, JsonConvert.SerializeObject(apiRequest));
                var response = rc.Execute(rr);
                //Encoding encoding = Encoding.Unicode;
                string tSvResult = response.Content; // encoding.GetString(response.RawBytes);

                var report = new YDCustomReport(initializer, false);
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    report.IsReady = true;
                    using (TextReader r = new StringReader(tSvResult))
                    {
                        //r.ReadLine(); // !! skip 1-st row with shit data !!
                        using (CsvReader cr = new CsvReader(r))
                        {
                            cr.Configuration.Delimiter = "\t";
                            using (var dr = new CsvDataReader(cr))
                            {
                                DataTable dt = new DataTable();
                                dt.Load(dr);
                                DataRow[] tblRows = dt.Rows.Cast <DataRow>().ToArray();
                                report.Rows = tblRows.Select(x => new CustomReportRow(
                                                                 x.Table.Columns.Cast <DataColumn>().ToDictionary(c => c.ColumnName, c => x[c]).Where(t => initializer.Columns.ContainsKey(t.Key)).Select(y => new CustomReportCell(initializer.Columns[y.Key], y.Value.ToString())).ToArray()
                                                                 )
                                                             ).ToArray();
                            }
                        }
                    }
                }
                else if (response.StatusCode == HttpStatusCode.Accepted || response.StatusCode == HttpStatusCode.Created)
                {
                    report.IsReady = false;
                }
                else
                {
                    throw new Exception(response.Content);
                }
                return(report);
            }
            catch (WebException ex)
            {
                using (StreamReader sr = new StreamReader(ex.Response.GetResponseStream()))
                {
                    var resp = sr.ReadToEnd();
                    throw new Exception(resp);
                }
            }
        }