/// <summary>
        /// Refresh universe data
        /// </summary>
        /// <param name="id"></param>
        public async Task <IActionResult> UpdateUniverse(int id)
        {
            var playerList   = OgameApi.GetAllPlayers(id);
            var allianceList = OgameApi.GetAllAlliances(id);
            var planetList   = OgameApi.GetAllPlanets(id);

            var universe = await StarMapBLL.GetServer(id);

            if (universe == null)
            {
                return(NotFound());                  //Server not found
            }
            //Load Alliance
            universe.Alliances          = allianceList.Alliances;
            universe.AllianceLastUpdate = allianceList.LastUpdate;

            //Load Players
            universe.Players           = playerList.Players;
            universe.PlayersLastUpdate = playerList.LastUpdate;

            //Load Planets
            foreach (var planet in planetList.Planets)
            {
                var owner = universe.Players.FirstOrDefault(p => p.Id == planet.OwnerId);
                if (owner == null)
                {
                    continue;                //Ignore if owner not in player list
                }
                var playerPlanet = owner.Planets.FirstOrDefault(pn => pn.Id == planet.Id);
                if (playerPlanet == null)
                {
                    //Add if not exist
                    owner.Planets.Add(planet);
                }
                else
                {
                    //Update if found
                    playerPlanet.Update(planet);
                }
            }
            universe.PlanetsLastUpdate = planetList.LastUpdate;

            //Update statistic
            universe.Statistic.PlayerCount       = universe.Players.Count;
            universe.Statistic.ActivePlayerCount = universe.Players.Where(p => p.IsActive).Count();
            universe.Statistic.PlanetCount       = planetList.Planets.Count;
            universe.Statistic.MoonCount         = planetList.Planets.Where(p => p.Moon != null).Count();
            universe.Statistic.LastUpdate        = DateTimeHelper.GetLatestDate(new List <DateTime>
            {
                planetList.LastUpdate,
                allianceList.LastUpdate,
                planetList.LastUpdate
            });
            universe.Statistic.MapUpdateDay = planetList.LastUpdate.ToString("ddd");
            await StarMapBLL.UpdateServerAsync(universe);

            return(RedirectToAction("Index"));
        }
        /// <summary>
        /// Update the server list
        /// </summary>
        /// <returns></returns>
        public async Task <IActionResult> UpdateServerList()
        {
            var servers = OgameApi.GetAllUniverses();

            foreach (var server in servers)
            {
                await StarMapBLL.CreateUniverseIfNotExistsAsync(server);
            }
            return(RedirectToAction("Index"));
        }
        /// <summary>
        /// Get server list and random target on Index
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            var vm = new StarIndexViewModel(StarMapBLL.GetServerList());
            var userServerPreference = HttpContext.Session.GetInt32(SessionServerSelection);

            if (userServerPreference != null)
            {
                vm.SearchViewModel.ServerId = (int)userServerPreference;
            }
            return(View(vm));
        }
        /// <summary>
        /// Update player scores
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task <IActionResult> UpdateScoreBoard(int id)
        {
            var totalScoreData    = OgameApi.GetHighScore(id, ScoreCategory.Player, ScoreType.Total);
            var econScoreData     = OgameApi.GetHighScore(id, ScoreCategory.Player, ScoreType.Economy);
            var researchScoreData = OgameApi.GetHighScore(id, ScoreCategory.Player, ScoreType.Research);
            var militaryScoreData = OgameApi.GetHighScore(id, ScoreCategory.Player, ScoreType.Military);
            var lastUpdate        = DateTimeHelper.GetLatestDate(new List <DateTime>
            {
                totalScoreData.LastUpdate,
                econScoreData.LastUpdate,
                researchScoreData.LastUpdate,
                militaryScoreData.LastUpdate
            });

            var scoreBoard = await StarMapBLL.GetScoreBoardAsync(id, ScoreCategory.Player);

            if (scoreBoard.LastUpdate == lastUpdate)
            {
                return(RedirectToAction("Index"));                                     //Abort if Api not updated
            }
            // Update total
            foreach (var scoreData in totalScoreData.Scores)
            {
                SetScore(scoreBoard, scoreData.Id, scoreData.Value, ScoreType.Total.ToString(), totalScoreData.LastUpdate);
            }
            // Update Economy
            foreach (var scoreData in econScoreData.Scores)
            {
                SetScore(scoreBoard, scoreData.Id, scoreData.Value, ScoreType.Economy.ToString(), econScoreData.LastUpdate);
            }
            // Update Research
            foreach (var scoreData in researchScoreData.Scores)
            {
                SetScore(scoreBoard, scoreData.Id, scoreData.Value, ScoreType.Research.ToString(), researchScoreData.LastUpdate);
            }
            // Update Military
            foreach (var scoreData in militaryScoreData.Scores)
            {
                SetScore(scoreBoard, scoreData.Id, scoreData.Value, ScoreType.Military.ToString(), militaryScoreData.LastUpdate);
                SetScore(scoreBoard, scoreData.Id, scoreData.Ships, "ShipNumber", militaryScoreData.LastUpdate);
            }
            //Calculate Ship score
            foreach (var score in scoreBoard.Scores)
            {
                var shipScore = score.Total - score.Economy - score.Research;
                SetScore(scoreBoard, score.Id, shipScore, "Ship", militaryScoreData.LastUpdate);
            }
            await StarMapBLL.UpdateScoreBoardAsync(scoreBoard);

            return(RedirectToAction("Index"));
        }
        public IActionResult Search(StarSearchViewModel vm)
        {
            var sivm = new StarIndexViewModel(StarMapBLL.GetServerList())
            {
                SearchViewModel = vm
            };

            sivm.SearchViewModel.Servers = sivm.Servers;
            HttpContext.Session.SetInt32(SessionServerSelection, vm.ServerId); //Remember option
            if (ModelState.IsValid)
            {
                sivm.IsSearch = true;

                //Search player
                var status = "";
                if (vm.PlayerStatus.IsBanned)
                {
                    status += "b";
                }
                if (vm.PlayerStatus.IsFlee)
                {
                    status += "o";
                }
                if (vm.PlayerStatus.IsInactive && !vm.PlayerStatus.IsLeft)
                {
                    status += "i";
                }
                if (vm.PlayerStatus.IsLeft)
                {
                    status += "I";
                }

                List <Player> players = new List <Player>();
                if (!vm.Coords.IsEmpty)
                {
                    //Search by coordinate
                    var planets = StarMapBLL.SearchPlanetsByCoordinate(vm.Coords, vm.ServerId, vm.Range);
                    foreach (var planet in planets)
                    {
                        var player = players.FirstOrDefault(p => p.Id == planet.OwnerId);
                        if (player != null)
                        {
                            //Player exists in list
                            planet.Owner = player; //Assign to planet
                            continue;
                        }

                        //Find all owners in range
                        var owner = StarMapBLL.SearchPlayerById(vm.ServerId, planet.OwnerId);
                        if (owner != null)
                        {
                            //Owner found in DB and is new
                            players.Add(StarMapBLL.SearchPlayerById(vm.ServerId, planet.OwnerId));
                            planet.Owner = owner;
                        }
                    }
                    sivm.Planets = planets;
                }
                else
                {
                    //Name only search
                    players.AddRange(StarMapBLL.SearchPlayerByName(vm.PlayerName ?? "", vm.ServerId, status));
                }
                sivm.AssignPlayers(players);
            }
            return(View("Index", sivm));
        }