protected NameValueCollection GetQueryParams(DataGroup group, DateTime exportDate, string range = "", string extraFields = "", bool countFlag = false)
        {
            //ServicePointManager.DefaultConnectionLimit = 48; //recommended to be 12 * number of logical CPUs
            //ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
            //if (Rules.Expect100Continue)
            //  ServicePointManager.Expect100Continue = true;
            //if (Rules.ForceProtocolSsl3)
            //  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

            var queryParams = new NameValueCollection();
            if (!string.IsNullOrEmpty(Rules.ApiAliasParam))
                queryParams.Add(Rules.ApiAliasParam, _migrationSlave ? Rules.MigrationRules.MigrationAlias : Alias);
            if (!string.IsNullOrEmpty(Rules.ApiKeyParam))
                queryParams.Add(Rules.ApiKeyParam, Rules.ApiKey);

            if (GetFeedType(group).Equals(FeedType.SingleApi))
            {
                var groupParam = Rules.ApiVersion < 3 && countFlag
                                                     ? "DataCount"
                                                     : "DataGroup";
                queryParams.Add(groupParam, group.ToString());
                if (Rules.ApiVersion >= 3 && countFlag)
                    queryParams.Add("ResultType", "Count");
            }

            switch (group)
            {
                case DataGroup.Sales:
                case DataGroup.Customers:
                    var month = exportDate.Month;
                    var year = exportDate.Year;
                    if (!string.IsNullOrEmpty(Rules.ApiMonthParam)
                            && !string.IsNullOrEmpty(Rules.ApiYearParam))
                    {
                        queryParams.Add(Rules.ApiMonthParam, month.ToString("D2"));
                        queryParams.Add(Rules.ApiYearParam, year.ToString("D4"));
                    }
                    else if ((group.Equals(DataGroup.Sales) && Rules.ApiSalesDateRangeEnabled)
                        || (group.Equals(DataGroup.Customers) && Rules.ApiCustomerDateRangeEnabled))
                    {
                        var dateParam = string.IsNullOrEmpty(Rules.ApiDateRangeParam)
                                                            ? "DateRange"
                                                            : Rules.ApiDateRangeParam;
                        var lastDay = DateTime.DaysInMonth(year, month);
                        queryParams.Add(dateParam, string.Format("{0}-{1}-01,{0}-{1}-{2}",
                                                                    year.ToString("D4"), month.ToString("D2"), lastDay.ToString("D2")));
                    }
                    break;
                case DataGroup.Catalog:
                    if (!string.IsNullOrEmpty(range) && Rules.ApiVersion < 3) //older API IdRange only applied to catalog
                    {
                        var rangeParam = string.IsNullOrEmpty(Rules.ApiIdRangeParam)
                                                        ?  "IdRange"
                                                        : Rules.ApiIdRangeParam;
                        queryParams.Add(rangeParam, range);
                    }
                    if (!string.IsNullOrEmpty(extraFields) && !Rules.OmitExtraFields)
                    {
                        var fieldParam = string.IsNullOrEmpty(Rules.ApiFieldParam)
                                                             ? "ExtraFields"
                                                             : Rules.ApiFieldParam;
                        queryParams.Add(fieldParam, extraFields);
                    }
                    break;
                case DataGroup.CategoryNames:
                    break;
                case DataGroup.ManufacturerNames:
                    break;
                case DataGroup.DepartmentNames:
                    break;
                case DataGroup.Inventory:
                    break;
                default:
                    throw new ArgumentOutOfRangeException("group");
            }

            //Newer API RowRange can apply to all data groups
            if (!string.IsNullOrEmpty(range) && Rules.ApiVersion >= 3)
            {
                var rangeParam = string.IsNullOrEmpty(Rules.ApiRowRangeParam)
                                                ? "RowRange"
                                                : Rules.ApiRowRangeParam;
                queryParams.Add(rangeParam, range);
            }

            //get any additional query params defined in site rules
            if (Rules.ApiAddQueries != null && Rules.ApiAddQueries.Any())
            {
                NameValueCollection queries;
                if (Rules.ApiAddQueries.TryGetValue(group, out queries))
                {
                    queryParams.Add(queries);
                    //foreach (var q in queries)
                    //  queryParams.Add(q);
                }
                if (Rules.ApiAddQueries.TryGetValue(DataGroup.All, out queries)) //some extra queries apply to all requests
                {
                    queryParams.Add(queries);
                }
            }

            return queryParams;
        }