// Set the Price & Currency on a requested currency name
        public void Calculate(DiskSize myDiskSize, decimal maxdisks, decimal mincapacity, decimal miniops, decimal minthroughput, TraceWriter log)
        {
            decimal DiskCountCapacity   = Math.Ceiling(mincapacity / myDiskSize.MaxDataDiskSizeGB);
            decimal DiskCountIops       = Math.Ceiling(miniops / myDiskSize.MaxDataDiskIops);
            decimal DiskCountThroughput = Math.Ceiling(minthroughput / myDiskSize.MaxDataDiskThroughputMBs);
            decimal DiskCountNeeded     = Math.Max(DiskCountCapacity, DiskCountIops);

            DiskCountNeeded = Math.Max(DiskCountThroughput, DiskCountNeeded);
            decimal DiskConfigPrice = DiskCountNeeded * myDiskSize.Price;

            log.Info("DiskConfigPrice : " + DiskConfigPrice.ToString());
            log.Info("DiskPrice : " + DiskPrice.ToString());
            log.Info("DiskCountCapacity : " + DiskCountCapacity.ToString());
            log.Info("DiskCountIops : " + DiskCountIops.ToString());
            log.Info("DiskCountThroughput : " + DiskCountThroughput.ToString());
            log.Info("DiskCountNeeded : " + DiskCountNeeded.ToString());
            log.Info("MaxDisks : " + maxdisks.ToString());

            if (DiskConfigPrice < DiskPrice && DiskCountNeeded <= maxdisks)
            {
                DiskPrice             = DiskConfigPrice;
                DiskCurrency          = myDiskSize.Currency;
                DiskType              = myDiskSize.Tier;
                DiskName              = myDiskSize.Name;
                DiskSize              = myDiskSize.Size;
                DiskCapacity          = myDiskSize.MaxDataDiskSizeGB;
                DiskIops              = myDiskSize.MaxDataDiskIops;
                DiskThroughput        = myDiskSize.MaxDataDiskThroughputMBs;
                DiskCount             = DiskCountNeeded;
                DiskConfigCapacity    = myDiskSize.MaxDataDiskSizeGB * DiskCountNeeded;
                DiskConfigIops        = myDiskSize.MaxDataDiskIops * DiskCountNeeded;
                DiskConfigThroughput  = myDiskSize.MaxDataDiskThroughputMBs * DiskCountNeeded;
                DiskConfigDescription = "A striped (raid0) set of " + DiskCountNeeded + " " + myDiskSize.Size + " " + "disk(s).";
            }
        }
        public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", "options", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            // CosmosDB Parameters, retrieved via environment variables
            string databaseName            = Environment.GetEnvironmentVariable("cosmosdbDatabaseName");
            string collectionName          = Environment.GetEnvironmentVariable("cosmosdbCollectionName");
            string mongodbConnectionString = Environment.GetEnvironmentVariable("cosmosdbMongodbConnectionString");

            // This endpoint is valid for all MongoDB
            var client     = new MongoClient(mongodbConnectionString);
            var database   = client.GetDatabase(databaseName);
            var collection = database.GetCollection <BsonDocument>(collectionName);

            // Region #
            string region = GetParameter("region", "europe-west", req).ToLower();

            log.Info("Region : " + region.ToString());
            // Currency #
            string currency = GetParameter("currency", "EUR", req).ToUpper();

            log.Info("Currency : " + currency.ToString());
            // Ssd #
            string disktype = GetParameter("disktype", "all", req).ToLower();
            string ssd      = GetParameter("ssd", "all", req).ToLower();

            string[] ssdfilter = new string[3];
            ssdfilter = SSDFilter(disktype, ssd);
            log.Info("SSD : " + ssd.ToString());
            log.Info("Type : " + disktype.ToString());
            log.Info("SSD[0] : " + ssdfilter[0]);
            log.Info("SSD[1] : " + ssdfilter[1]);
            log.Info("SSD[2] : " + ssdfilter[2]);
            // IOPS (Min) #
            decimal iops = Convert.ToDecimal(GetParameter("iops", "1", req));

            iops = SetMinimum(iops, 1);
            log.Info("IOPS : " + iops.ToString());
            // Throughput (Min) #
            decimal throughput = Convert.ToDecimal(GetParameter("throughput", "1", req));

            throughput = SetMinimum(throughput, 1);
            log.Info("Throughput : " + throughput.ToString());
            // Data (Disk Capacity) (Min) #
            decimal data = Convert.ToDecimal(GetParameter("data", "1", req));

            data = SetMinimum(data, 1);
            log.Info("Data : " + data.ToString());
            // Max Disks (Min) #
            decimal maxdisks = Convert.ToDecimal(GetParameter("maxdisks", "64", req));

            maxdisks = SetMinimum(maxdisks, 1);
            log.Info("MaxDisks : " + maxdisks.ToString());

            var filterBuilder = Builders <BsonDocument> .Filter;
            var filter        = filterBuilder.Eq("type", "disk")
                                & filterBuilder.Eq("disktype", "md")
                                & filterBuilder.Eq("region", region)
                                & filterBuilder.In("tier", ssdfilter)
            ;
            var sort = Builders <BsonDocument> .Sort.Ascending("price");

            var cursor = collection.Find <BsonDocument>(filter).Sort(sort).ToCursor();

            // Load Application Insights
            string          ApplicationInsightsKey = TelemetryConfiguration.Active.InstrumentationKey = System.Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);
            TelemetryClient telemetry = new TelemetryClient()
            {
                InstrumentationKey = ApplicationInsightsKey
            };

            // Get results and put them into a list of objects
            DiskConfig myDiskConfig = new DiskConfig();

            myDiskConfig.DiskPrice = 999999999;
            foreach (var document in cursor.ToEnumerable())
            {
                // Get RequestCharge
                var LastRequestStatistics = database.RunCommand <BsonDocument>(new BsonDocument {
                    { "getLastRequestStatistics", 1 }
                });
                double RequestCharge = (double)LastRequestStatistics["RequestCharge"];
                telemetry.TrackMetric("RequestCharge", RequestCharge);

                // log.Info(document.ToString());
                DiskSize myDiskSize = BsonSerializer.Deserialize <DiskSize>(document);
                // log.Info(myDiskSize.Name);
                myDiskSize.SetCurrency(currency);
                myDiskConfig.Calculate(myDiskSize, maxdisks, data, iops, throughput, log);
            }

            // Convert to JSON & return it
            var json = JsonConvert.SerializeObject(myDiskConfig, Formatting.Indented);

            return(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(json, Encoding.UTF8, "application/json")
            });
        }