private async Task <double> GetTankWN8(PlayerVehicleStatistics vehicleStats)
        {
            if (referencialWN8Data == null)
            {
                var dataProvider = new ReferentialWN8DataRestService();
                referencialWN8Data = await dataProvider.GetReferencialWN8DataAsync();
            }

            var tankReferentialData = referencialWN8Data.data
                                      .Where(data => data.IDNum == Int32.Parse(vehicleStats.tank_id))
                                      .FirstOrDefault();

            var wn8calc = new CalculatorWN8
            {
                AverageDamage  = (double)vehicleStats.all.damage_dealt / vehicleStats.all.battles,
                AverageDefense = (double)vehicleStats.all.dropped_capture_points / vehicleStats.all.battles,
                AverageFrag    = (double)vehicleStats.all.frags / vehicleStats.all.battles,
                AverageSpot    = (double)vehicleStats.all.spotted / vehicleStats.all.battles,
                WinRate        = (double)vehicleStats.all.wins / vehicleStats.all.battles,

                ExpectedDamage  = tankReferentialData.expDamage,
                ExpectedDefense = tankReferentialData.expDef,
                ExpectedFrag    = tankReferentialData.expFrag,
                ExpectedSpot    = tankReferentialData.expSpot,
                ExpectedWinRate = tankReferentialData.expWinRate
            };

            return(wn8calc.GetWN8Value());
        }
        public async Task <double> GetWN8OverallValueAsync()
        {
            var vehicleStatsProvider = new PlayerVehiclesStatisticsRestService();
            var stats = await vehicleStatsProvider
                        .GetPlayerVehiclesStatisticsAsync(App.Database.GetUsers()[0].AccountId, App.Database.GetUsers()[0].WoTServer);



            var dataProvider       = new ReferentialWN8DataRestService();
            var referencialWN8Data = await dataProvider.GetReferencialWN8DataAsync();



            double RatingWN8_TotalDamage  = 0;
            double RatingWN8_TotalFrag    = 0;
            double RatingWN8_TotalSpot    = 0;
            double RatingWN8_TotalDef     = 0;
            double RatingWN8_TotalWinrate = 0;

            double RatingWN8_ExpDamage  = 0;
            double RatingWN8_ExpFrag    = 0;
            double RatingWN8_ExpSpot    = 0;
            double RatingWN8_ExpDef     = 0;
            double RatingWN8_ExpWinrate = 0;

            foreach (var s in stats.Where(d => d.all.battles > 0))
            {
                var exp = referencialWN8Data.data
                          .Where(d => d.IDNum == Int32.Parse(s.tank_id))
                          .FirstOrDefault();

                RatingWN8_TotalDamage += s.all.damage_dealt;
                RatingWN8_ExpDamage   += exp.expDamage * s.all.battles;

                RatingWN8_TotalFrag  += s.all.frags;
                RatingWN8_ExpFrag    += exp.expFrag * s.all.battles;
                RatingWN8_TotalSpot  += s.all.spotted;
                RatingWN8_ExpSpot    += exp.expSpot * s.all.battles;
                RatingWN8_TotalDef   += s.all.dropped_capture_points;
                RatingWN8_ExpDef     += exp.expDef * s.all.battles;
                RatingWN8_ExpWinrate += (exp.expWinRate) / 100 * s.all.battles;
            }



            double rDamage  = RatingWN8_TotalDamage / RatingWN8_ExpDamage;
            double rSpot    = RatingWN8_TotalSpot / RatingWN8_ExpSpot;
            double rFrag    = RatingWN8_TotalFrag / RatingWN8_ExpFrag;
            double rDefense = RatingWN8_TotalDef / RatingWN8_ExpDef;
            double rWinRate = RatingWN8_TotalWinrate / RatingWN8_ExpWinrate;



            double cWinRate = Math.Max(0.0, fractionUtil(rWinRate, winRateConst));
            double cDamage  = Math.Max(0.0, fractionUtil(rDamage, damageConst));
            double cFrag    = Math.Max(0.0, Math.Min(cDamage + 0.2, fractionUtil(rFrag, fragConst)));
            double cSpot    = Math.Max(0.0, Math.Min(cDamage + 0.1, fractionUtil(rSpot, spotConst)));
            double cDefense = Math.Max(0.0, Math.Min(cDamage + 0.1, fractionUtil(rDefense, defenseConst)));

            double WN8 = 980.0 * cDamage +
                         210.0 * cDamage * cFrag +
                         155.0 * cFrag * cSpot +
                         75.00 * cDefense * cFrag +
                         145.0 * Math.Min(1.8, cWinRate);

            return(WN8);
        }