public async Task <IActionResult> List()
        {
            IEnumerable <BuildingPlanViewModel> model = null;

            try
            {
                var buildingPlans = (await _buildingPlanRepository.GetBuildingPlans(User.Identity.Name)).ToList();
                var @default      = await _buildingPlanRepository.GetBuildingPlans(BuildingPlanRepository.DefaultPlanUserName);

                @default.ToList().ForEach(x => x.BotUserName = string.Empty);
                buildingPlans.AddRange(@default);
                model = buildingPlans.Select(x => _mapper.Map <BuildingPlanViewModel>(x));
            }
            catch (Exception exc)
            {
                _logger.LogError(LoggingEvents.GetItemException, exc, exc.Message);
            }

            return(View(model));
        }
        public async Task <(bool HasMoreToBuild, IEnumerable <BuildAction> Actions)> GetBuildActions(Village village, IEnumerable <BuildingModel> allBuildings = null)
        {
            var result               = new List <BuildAction>();
            var buildings            = (allBuildings ?? await _buildingRepository.GetAllBuildings()).ToList();
            var dorf1BuildingToBuild = GetResourceFieldToBuildNext(village, buildings);

            if (dorf1BuildingToBuild != null)
            {
                result.Add(new BuildAction
                {
                    BuildingId   = dorf1BuildingToBuild.BuildingId,
                    Action       = GameActionType.BUILD,
                    BuildingSlot = dorf1BuildingToBuild.Id,
                    Village      = village
                });
            }

            BuildingPlanModel plan = null;

            if (!string.IsNullOrEmpty(village.BuildingPlanId))
            {
                plan = await _buildingPlanRepository.GetBuildingPlan(village.BuildingPlanId);
            }
            if (plan == null)
            {
                plan = (await _buildingPlanRepository.GetBuildingPlans(BuildingPlanRepository.DefaultPlanUserName)).FirstOrDefault();
            }

            var hasMoreBuildingsToBuild = TryGetNextBuildingInVillageToBuildFromBuildingPlan(village, buildings, plan, out var dorf2Building);

            if (dorf2Building != null)
            {
                var slot2 = village.BuildingSlots
                            .Where(x => x.BuildingId == dorf2Building.BuildingId)
                            .OrderBy(x => x.Level)
                            .FirstOrDefault();

                result.Add(new BuildAction
                {
                    BuildingId   = dorf2Building.BuildingId,
                    Action       = GameActionType.BUILD,
                    BuildingSlot = string.IsNullOrEmpty(slot2?.Id) ? dorf2Building.PrefferedBuildingSlot : slot2.Id,
                    Village      = village
                });
            }

            return(hasMoreBuildingsToBuild || dorf1BuildingToBuild != null, result);
        }
        public async Task <IActionResult> Settings(string username, [FromQuery] string villageId)
        {
            VillageViewModel model = null;

            try
            {
                var villages = await _villageRepository.GetVillages(username);

                var village = villages.FirstOrDefault(x => x.VillageId == villageId); //await _villageRepository.GetVillage(villageId);
                if (village.PlayerName != username)
                {
                    return(NotFound($"Unable to find village [{villageId}] for travian user [{username}]"));
                }

                var user = await _travianUserRepository.GetUserByName(username, User.Identity.Name);

                var units = await _unitRepository.GetUnitsByTribe(user.PlayerData.Tribe);

                units = units.Where(x => x.UnitType != UnitType.EXPANSION && x.Name != "trader");
                var buildingPlans = await _buildingPlanRepository.GetBuildingPlans(User.Identity.Name);

                ViewData["buildingPlans"] = buildingPlans;
                ViewData["villageId"]     = villageId;
                ViewData["username"]      = username;
                ViewData["units"]         = units;
                ViewData["trainUnits"]    = village.PreferableUnits;
                ViewData["spamUnits"]     = village.SpamUnits;
                ViewData["timeZone"]      = string.IsNullOrEmpty(user.PlayerData.TimeZone) ? "UTC+0" : user.PlayerData.TimeZone;

                model = _mapper.Map <VillageViewModel>(village);
            }
            catch (Exception exc)
            {
                _logger.LogError(LoggingEvents.UpdateItemException, exc, exc.Message);
            }

            return(View(model));
        }