private void UpdateUser(string[] selectedPartys, string[] selectedRegions,
                                string[] selectedShelters, string[] selectedTrails, AppUser userToUpdate)
        {
            if (selectedPartys == null || selectedRegions == null ||
                selectedShelters == null || selectedTrails == null)
            {
                if (selectedPartys == null)
                {
                    userToUpdate.PermissionPartys = new List <PermissionParty>();
                }
                if (selectedRegions == null)
                {
                    userToUpdate.PermissionRegions = new List <PermissionRegion>();
                }
                if (selectedShelters == null)
                {
                    userToUpdate.PermissionShelters = new List <PermissionShelter>();
                }
                if (selectedTrails == null)
                {
                    userToUpdate.PermissionTrails = new List <PermissionTrail>();
                }

                return;
            }

            var selectedPartysHS = new HashSet <string>(selectedPartys);
            var userPartys       = new HashSet <int>
                                       (userToUpdate.PermissionPartys.Select(c => c.Party.IdParty));

            foreach (var party in _appDbContext.Partys)
            {
                if (selectedPartysHS.Contains(party.IdParty.ToString()))
                {
                    if (!userPartys.Contains(party.IdParty))
                    {
                        userToUpdate.PermissionPartys.Add(new PermissionParty {
                            IdUser = userToUpdate.Id, IdParty = party.IdParty
                        });
                    }
                }
                else
                {
                    if (userPartys.Contains(party.IdParty))
                    {
                        PermissionParty partyToRemove = userToUpdate.PermissionPartys.FirstOrDefault(i => i.IdParty == party.IdParty);
                        _appDbContext.Remove(partyToRemove);
                    }
                }
            }

            var selectedRegionsHS = new HashSet <string>(selectedRegions);
            var userRegions       = new HashSet <int>
                                        (userToUpdate.PermissionRegions.Select(c => c.Region.IdRegion));

            foreach (var region in _appDbContext.Regions)
            {
                if (selectedRegionsHS.Contains(region.IdRegion.ToString()))
                {
                    if (!userRegions.Contains(region.IdRegion))
                    {
                        userToUpdate.PermissionRegions.Add(new PermissionRegion {
                            IdUser = userToUpdate.Id, IdRegion = region.IdRegion
                        });
                    }
                }
                else
                {
                    if (userRegions.Contains(region.IdRegion))
                    {
                        PermissionRegion regionToRemove = userToUpdate.PermissionRegions.FirstOrDefault(i => i.IdRegion == region.IdRegion);
                        _appDbContext.Remove(regionToRemove);
                    }
                }
            }

            var selectedSheltersHS = new HashSet <string>(selectedShelters);
            var userShelters       = new HashSet <int>
                                         (userToUpdate.PermissionShelters.Select(c => c.Shelter.IdShelter));

            foreach (var shelter in _appDbContext.Shelters)
            {
                if (selectedSheltersHS.Contains(shelter.IdShelter.ToString()))
                {
                    if (!userShelters.Contains(shelter.IdShelter))
                    {
                        userToUpdate.PermissionShelters.Add(new PermissionShelter {
                            IdUser = userToUpdate.Id, IdShelter = shelter.IdShelter
                        });
                    }
                }
                else
                {
                    if (userShelters.Contains(shelter.IdShelter))
                    {
                        PermissionShelter shelterToRemove = userToUpdate.PermissionShelters.FirstOrDefault(i => i.IdShelter == shelter.IdShelter);
                        _appDbContext.Remove(shelterToRemove);
                    }
                }
            }

            var selectedTrailsHS = new HashSet <string>(selectedTrails);
            var userTrails       = new HashSet <int>
                                       (userToUpdate.PermissionTrails.Select(c => c.Trail.IdTrail));

            foreach (var trail in _appDbContext.Trails)
            {
                if (selectedTrailsHS.Contains(trail.IdTrail.ToString()))
                {
                    if (!userTrails.Contains(trail.IdTrail))
                    {
                        userToUpdate.PermissionTrails.Add(new PermissionTrail {
                            IdUser = userToUpdate.Id, IdTrail = trail.IdTrail
                        });
                    }
                }
                else
                {
                    if (userTrails.Contains(trail.IdTrail))
                    {
                        PermissionTrail trailToRemove = userToUpdate.PermissionTrails.FirstOrDefault(i => i.IdTrail == trail.IdTrail);
                        _appDbContext.Remove(trailToRemove);
                    }
                }
            }
        }
        public async Task <IActionResult> Create(AppUser user, string[] selectedPartys, string[] selectedRegions, string[] selectedShelters, string[] selectedTrails)
        {
            if (selectedPartys != null)
            {
                user.PermissionPartys = new List <PermissionParty>();
                foreach (var party in selectedPartys)
                {
                    var partyToAdd = new PermissionParty {
                        IdUser = user.Id, IdParty = int.Parse(party)
                    };
                    user.PermissionPartys.Add(partyToAdd);
                }
            }

            if (selectedRegions != null)
            {
                user.PermissionRegions = new List <PermissionRegion>();
                foreach (var region in selectedRegions)
                {
                    var regionToAdd = new PermissionRegion {
                        IdUser = user.Id, IdRegion = int.Parse(region)
                    };
                    user.PermissionRegions.Add(regionToAdd);
                }
            }

            if (selectedShelters != null)
            {
                user.PermissionShelters = new List <PermissionShelter>();
                foreach (var shelter in selectedShelters)
                {
                    var shelterToAdd = new PermissionShelter {
                        IdUser = user.Id, IdShelter = int.Parse(shelter)
                    };
                    user.PermissionShelters.Add(shelterToAdd);
                }
            }

            if (selectedTrails != null)
            {
                user.PermissionTrails = new List <PermissionTrail>();
                foreach (var trail in selectedTrails)
                {
                    var trailToAdd = new PermissionTrail {
                        IdUser = user.Id, IdTrail = int.Parse(trail)
                    };
                    user.PermissionTrails.Add(trailToAdd);
                }
            }

            if (ModelState.IsValid)
            {
                _appDbContext.Add(user);
                await _appDbContext.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }

            PopulateUser(user);

            return(View(user));
        }