public async Task <List <VehicleVisibleData> > GetVehiclesVisibleDataAsync(User user)
        {
            var statisticsRestService = new PlayerVehiclesStatisticsRestService();

            var tankopediaRestService = new TankopediaVehicleRestService();

            var vehiclesStatistics = await statisticsRestService.GetPlayerVehiclesStatisticsAsync(user.AccountId, user.WoTServer);

            var tanksData = new List <VehicleVisibleData>();

            foreach (var stat in vehiclesStatistics)
            {
                var vehicle = await tankopediaRestService.GetTankopediaVehicleAsync(stat.tank_id, user.WoTServer);

                if (vehicle != null)
                {
                    double wn8 = await GetTankWN8(stat);

                    tanksData.Add(new VehicleVisibleData
                    {
                        Name      = vehicle.name,
                        AvgDamage = ((double)stat.all.damage_dealt / stat.all.battles).ToString("F", CultureInfo.InvariantCulture),
                        Battles   = stat.all.battles.ToString(),
                        WinRate   = ((double)stat.all.wins / stat.all.battles).ToString("P", CultureInfo.InvariantCulture),
                        WN8       = wn8.ToString("F", CultureInfo.InvariantCulture),
                    });
                }
            }

            return(tanksData);
        }
        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);
        }