public void SaveEveMarketOrdersDataAnalysisAsCSV(EveMarketOrdersDataAnalysis eveMarketDataAnalysis, string fileName)
        {
            StringBuilder csvBuild = new StringBuilder();

            csvBuild.AppendLine($"ItemName,Price,BasePrice,Difference,ProfitMargin,AverageVolume,AverageDailyProfitPotential,PercentSoldInventory"); //header

            foreach (var itemOrderComparison in eveMarketDataAnalysis.ItemOrderComparisons)
            {
                csvBuild.AppendLine($"{ itemOrderComparison.Name }," +
                                    $"{ itemOrderComparison.Price },{ itemOrderComparison.BasePrice },{ itemOrderComparison.Difference }, { itemOrderComparison.ProfitMargin}," +
                                    $"{ itemOrderComparison.AverageVolume }, { itemOrderComparison.AverageDailyProfitPotential }, { itemOrderComparison.PercentMarketInventorySold }");
            }

            if (!Directory.Exists("exports"))
            {
                Directory.CreateDirectory("exports");
            }

            File.WriteAllText(Path.Combine("exports", fileName), csvBuild.ToString());
            Console.WriteLine($"Saved CSV as { fileName }");
        }
        public EveMarketOrdersDataAnalysis GetAnalysis(long regionId, int itemLimit)
        {
            var baseRegionId = 10000002; //Jita

            EveMarketOrdersDataAnalysis result = new EveMarketOrdersDataAnalysis();

            result.BaseRegionId = baseRegionId;
            result.RegionId     = regionId;


            var items = ItemProvider.Items();

            if (itemLimit > 0)
            {
                items = items.Take(itemLimit).ToDictionary(i => i.Key, j => j.Value);
            }

            var regionOrders     = _eveMarketData.RegionMarketOrders.FirstOrDefault(r => r.RegionId == regionId);
            var baseRegionOrders = _eveMarketData.RegionMarketOrders.FirstOrDefault(r => r.RegionId == baseRegionId);

            var regionHistory = _eveMarketData.RegionMarketHistories.FirstOrDefault(r => r.RegionId == regionId);

            foreach (var item in items)
            {
                var itemHistory = regionHistory.ItemMarketHistories.FirstOrDefault(h => h.ItemId == item.Key);

                //Get all the orders for this item
                var orders     = regionOrders.ItemMarketOrders.FirstOrDefault(i => i.ItemId == item.Key).MarketOrders.ToList();
                var baseOrders = baseRegionOrders.ItemMarketOrders.FirstOrDefault(i => i.ItemId == item.Key).MarketOrders.ToList();

                var sellOrders     = orders.Where(o => !o.is_buy_order).OrderBy(p => p.price).ToList();
                var baseSellOrders = baseOrders.Where(o => !o.is_buy_order).OrderBy(p => p.price).ToList();

                float sellOrderWeightedAveragePrice     = CalculateWeightedAverage(sellOrders);
                float baseSellOrderWeightedAveragePrice = CalculateWeightedAverage(baseSellOrders);

                long    totalMarketInventory = sellOrders.Sum(t => t.volume_total);
                long    totalSoldInventory   = sellOrders.Sum(t => (t.volume_total - t.volume_remain));
                decimal percentSoldInventory = totalMarketInventory > 0 ? ((decimal)totalSoldInventory / totalMarketInventory) * 100 : 0;


                float lowestSellOrder  = sellOrders.Any() ? sellOrders.OrderBy(p => p.price).FirstOrDefault().price : 0;
                float highestSellOrder = sellOrders.Any() ? sellOrders.OrderByDescending(p => p.price).FirstOrDefault().price : 0;

                float baseLowestSellOrder  = baseSellOrders.Any() ? baseSellOrders.OrderBy(p => p.price).FirstOrDefault().price : 0;
                float baseHighestSellOrder = baseSellOrders.Any() ? baseSellOrders.OrderByDescending(p => p.price).FirstOrDefault().price : 0;

                double averageVolume = itemHistory.MarketHistory.Any() ? itemHistory.MarketHistory.Average(h => h.volume) : 0;

                ItemOrderComparison itemOrderComparison = new ItemOrderComparison
                {
                    Id                         = item.Key,
                    Name                       = item.Value,
                    BasePrice                  = baseLowestSellOrder,
                    Price                      = lowestSellOrder,
                    WeightedAveragePrice       = sellOrderWeightedAveragePrice,
                    WeightedAverageBasePrice   = baseSellOrderWeightedAveragePrice,
                    AverageVolume              = (long)averageVolume,
                    PercentMarketInventorySold = percentSoldInventory
                };

                result.ItemOrderComparisons.Add(itemOrderComparison);
            }


            return(result);
        }