public ActionResult GetNeighbourhoodByMapType(string mapType)
        {
            string   categoryName = GetCategoryName(mapType);
            Category category     = (Category)System.Enum.Parse(typeof(Category), categoryName);

            if (String.IsNullOrEmpty(categoryName))
            {
                return(Json(new { succes = false, JsonRequestBehavior.AllowGet }));
            }

            ApplicationUser user = GetUser();

            var categoryParam       = new SqlParameter("@category", (int)category);
            var congregationIdParam = new SqlParameter("@congregationId", user.CongregationId);
            var neighbourhoods      = _context.Database.SqlQuery <NeighbourhoodsVisits>("GetNeighbourhoodsByLastVisited @category, @congregationId", categoryParam, congregationIdParam).ToList();

            var max = (neighbourhoods.ToList().Count < 3) ? neighbourhoods.ToList().Count : 3;

            var territoryMapViewModel = new TerritoryMapViewModel
            {
                Neighbourhoods           = neighbourhoods.Select(n => n.Neighbourhood),
                NeighbourhoodsSuggestion = neighbourhoods.Select(n => n.Neighbourhood).Take(max),
            };

            return(Json(new { success = true, territoryMapViewModel, JsonRequestBehavior.AllowGet }));
        }
        private List <Householder> GetHouseholdersToVisit(TerritoryMapViewModel territory, ApplicationUser user)
        {
            var myCongregationTerritoriesMap     = _context.TerritoryMaps.Include(t => t.Householders).Where(t => t.CongregationId == user.CongregationId);
            List <Householder> houseHoldersInMap = new List <Householder>();

            foreach (var terrytoryMap in myCongregationTerritoriesMap)
            {
                houseHoldersInMap.AddRange(terrytoryMap.Householders);
            }

            var categoryParam          = new SqlParameter("@category", (int)territory.Category);
            var congregationIdParam    = new SqlParameter("@congregationId", user.CongregationId);
            var neighbourhoodParam     = new SqlParameter("@neighbourhood", territory.selectedNeighbourhood);
            var householdersToVisitIds = _context.Database.SqlQuery <int>("GetLastVisitedPeople @category, @congregationId, @neighbourhood", categoryParam, congregationIdParam, neighbourhoodParam).ToList();

            var householdersToVisit = _context.Householders.Include(h => h.Visits).Where(h => householdersToVisitIds.Any(p => p == h.Id)).ToList();

            householdersToVisit = householdersToVisit.OrderBy(h => householdersToVisitIds.IndexOf(h.Id)).ToList();

            return(householdersToVisit);
        }
        public ActionResult New(TerritoryMapViewModel territoryMapViewModel)
        {
            try
            {
                var locationService   = new GoogleLocationService(ConfigurationManager.AppSettings["GooglePlaceAPIKey"]);
                var googleMapsService = new GoogleMapsService(ConfigurationManager.AppSettings["GooglePlaceAPIKey"]);

                ApplicationUser user = GetUser();
                var             householdersToVisit = GetHouseholdersToVisit(territoryMapViewModel, user);

                //Vou mudar isso para refletir as mudanças no algoritmo de montagem dos mapas
                territoryMapViewModel.MaxNumberOfHouseholders      = 5;
                territoryMapViewModel.MaxDistanceAmongHouseholders = 5000;


                if (householdersToVisit == null)
                {
                    return(View("NotAvailableHouseholders"));
                }

                var newTerritoryMap = new TerritoryMap()
                {
                    CongregationId = user.CongregationId,
                    Neighbourhood  = territoryMapViewModel.selectedNeighbourhood,
                    Householders   = new List <Householder>(),
                    UserId         = user.Id
                };

                if (householdersToVisit.Count > 0)
                {
                    var firstHouseholderToVisit = householdersToVisit.First();
                    newTerritoryMap.Householders.Add(firstHouseholderToVisit);
                    householdersToVisit.Remove(firstHouseholderToVisit);

                    for (int i = 0; newTerritoryMap.Householders.Count() < territoryMapViewModel.MaxNumberOfHouseholders && i < householdersToVisit.Count(); i++)
                    {
                        var distance = googleMapsService.GetDistance(new LatLng((decimal)firstHouseholderToVisit.Latitude, (decimal)firstHouseholderToVisit.Longitude),
                                                                     new LatLng((decimal)householdersToVisit[i].Latitude, (decimal)householdersToVisit[i].Longitude));

                        if (distance <= territoryMapViewModel.MaxDistanceAmongHouseholders)
                        {
                            newTerritoryMap.Householders.Add(householdersToVisit[i]);
                        }
                    }

                    _context.TerritoryMaps.Add(newTerritoryMap);
                    _context.SaveChanges();
                }
                else
                {
                    return(View("NoMap"));
                }

                return(RedirectToAction("Index"));
            }
            catch (Exception e)
            {
                System.Threading.Thread.Sleep(1000);
                return(New(territoryMapViewModel));
            }
        }