/// <summary>The get order stats from xml.</summary>
        /// <param name="stream">The stream.</param>
        /// <returns>The market orders object.</returns>
        private static ItemMarketOrders GetMarketOrdersFromXml(Stream stream)
        {
            var orderData = new ItemMarketOrders();

            using (TextReader reader = new StreamReader(stream))
            {
                XDocument xml = XDocument.Load(reader);

                // ReSharper disable PossibleNullReferenceException
                XElement dataElement = xml.Root.Element("quicklook");

                if (dataElement != null)
                {
                    orderData.ItemTypeId = dataElement.Element("item").Value.ToInt32();
                    orderData.ItemName   = dataElement.Element("itemname").Value;
                    orderData.Regions    =
                        new HashSet <int>(
                            dataElement.Element("regions")
                            .Value.Split(',')
                            .Select(region => region.ToInt32())
                            .Where(region => region > 0));
                    orderData.Hours       = dataElement.Element("hours").Value.ToInt32();
                    orderData.MinQuantity = dataElement.Element("minqty").Value.ToInt32();

                    // sell orders
                    XElement orderElement;
                    if ((orderElement = dataElement.Element("sell_orders")) != null)
                    {
                        orderData.SellOrders = GetIndivdualOrders(orderElement, false).ToList();
                    }

                    // buy orders
                    if ((orderElement = dataElement.Element("buy_orders")) != null)
                    {
                        orderData.BuyOrders = GetIndivdualOrders(orderElement, true).ToList();
                    }
                }
            }

            // ReSharper restore PossibleNullReferenceException
            return(orderData);
        }
        /// <summary>Gets the current market orders for the item, using the region, system and quantity constraints</summary>
        /// <param name="itemTypeId">The item ID to query</param>
        /// <param name="includedRegions">Regions to include in the query for data.</param>
        /// <param name="systemId">Specific system to use to source data (if set will overrride regions)</param>
        /// <param name="minQuantity">Minimum Quantity for an order to be included/</param>
        /// <returns>Returns a reference to the async task.</returns>
        public Task <ItemMarketOrders> GetMarketOrdersForItemType(int itemTypeId, IEnumerable <int> includedRegions,
                                                                  int?systemId, int minQuantity)
        {
            return(Task <ItemMarketOrders> .Factory.TryRun(
                       () =>
            {
                string cacheKey;
                IList <int> regionList = includedRegions != null ? includedRegions.ToList() : new List <int>();
                if (systemId.HasValue)
                {
                    cacheKey = CalcCacheKey(new[] { systemId.Value });
                }
                else if (includedRegions != null && regionList.Any())
                {
                    cacheKey = CalcCacheKey(regionList);
                }
                else
                {
                    cacheKey = CalcCacheKey(new[] { JitaSystemId });
                }

                CacheItem <ItemMarketOrders> cachedData =
                    _marketOrderCache.Get <ItemMarketOrders>(ItemKeyFormat.FormatInvariant(itemTypeId, cacheKey));
                ItemMarketOrders itemData = null;
                if (cachedData == null || cachedData.IsDirty)
                {
                    // make the request for the types we don't have valid caches for
                    NameValueCollection requestParameters = CreateMarketRequestParameters(new[] { itemTypeId },
                                                                                          regionList, systemId ?? 0, minQuantity);
                    Task <HttpResponseMessage> requestTask =
                        _requestProvider.PostAsync(new Uri(EveCentralBaseUrl + QuickLookApi), requestParameters);

                    requestTask.Wait();     // wait for the completion (we're in a background task anyways)

                    if (requestTask.IsCompleted && !requestTask.IsCanceled && !requestTask.IsFaulted &&
                        requestTask.Exception == null && requestTask.Result != null)
                    {
                        Task <Stream> contentStreamTask = requestTask.Result.Content.ReadAsStreamAsync();
                        contentStreamTask.Wait();
                        using (Stream stream = contentStreamTask.Result)
                        {
                            try
                            {
                                // process result
                                ItemMarketOrders data = GetMarketOrdersFromXml(stream);

                                _marketOrderCache.Add(ItemKeyFormat.FormatInvariant(itemTypeId, cacheKey), data,
                                                      DateTimeOffset.Now.Add(TimeSpan.FromHours(1)));

                                itemData = data;
                            }
                            catch (Exception ex)
                            {
                                Trace.TraceError(ex.FormatException());
                                throw;
                            }
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException("There was a problem requesting the market data.",
                                                            requestTask.Exception);
                    }
                }

                return itemData ?? (cachedData != null ? cachedData.Data : null);
            }));
        }
        /// <summary>The get order stats from xml.</summary>
        /// <param name="stream">The stream.</param>
        /// <returns>The market orders object.</returns>
        private static ItemMarketOrders GetMarketOrdersFromXml(Stream stream)
        {
            var orderData = new ItemMarketOrders();

            using (TextReader reader = new StreamReader(stream))
            {
                XDocument xml = XDocument.Load(reader);

                // ReSharper disable PossibleNullReferenceException
                XElement dataElement = xml.Root.Element("quicklook");

                if (dataElement != null)
                {
                    orderData.ItemTypeId = dataElement.Element("item").Value.ToInt32();
                    orderData.ItemName = dataElement.Element("itemname").Value;
                    orderData.Regions =
                        new HashSet<int>(
                            dataElement.Element("regions")
                                .Value.Split(',')
                                .Select(region => region.ToInt32())
                                .Where(region => region > 0));
                    orderData.Hours = dataElement.Element("hours").Value.ToInt32();
                    orderData.MinQuantity = dataElement.Element("minqty").Value.ToInt32();

                    // sell orders
                    XElement orderElement;
                    if ((orderElement = dataElement.Element("sell_orders")) != null)
                    {
                        orderData.SellOrders = GetIndivdualOrders(orderElement, false).ToList();
                    }

                    // buy orders
                    if ((orderElement = dataElement.Element("buy_orders")) != null)
                    {
                        orderData.BuyOrders = GetIndivdualOrders(orderElement, true).ToList();
                    }
                }
            }

            // ReSharper restore PossibleNullReferenceException
            return orderData;
        }