public string ExportUserSecurity()
        {
            var jsonPayLoad = "";

            try
            {
                var userProfiles = new UserSecurityProfileList();

                foreach (var user in this._users)
                {
                    var disabled = user.GetAttributeValue <bool>("isdisabled");

                    if (!disabled)
                    {
                        //build object
                        var userProfile = new UserSecurityProfile()
                        {
                            emails = new List <string>()
                            {
                                user.GetAttributeValue <string>("domainname")
                            }
                        };

                        userProfile.businessUnit = user.GetAttributeValue <EntityReference>("businessunitid").Name;

                        var userRoles = GetUserSecurityRoles(user.Id);
                        userProfile.roles = userRoles.Select(entity => entity.GetAttributeValue <string>("name")).ToList();
                        userProfile.roles.Sort();

                        //need to exclude from list
                        var userTeams = GetUserTeams(user.Id);
                        userProfile.teams = userTeams.Select(entity => entity.GetAttributeValue <string>("name")).ToList();
                        userProfile.teams.Sort();

                        //need to exclude from list - do.where.select
                        var userQueues = GetUserQueues(user.Id);
                        userProfile.queues = userQueues
                                             .Where(item => item.GetAttributeValue <AliasedValue>("team.name") == null &&
                                                    item.GetAttributeValue <EntityReference>("ownerid").Id != user.Id)
                                             .Select(entity => entity.GetAttributeValue <string>("name")).ToList();
                        userProfile.queues.Sort();

                        if (userProfiles.Where <UserSecurityProfile>(profile =>
                                                                     user.GetAttributeValue <EntityReference>("businessunitid").Name == profile.businessUnit &&
                                                                     userProfile.roles.SequenceEqual(profile.roles) &&
                                                                     userProfile.teams.SequenceEqual(profile.teams) &&
                                                                     userProfile.queues.SequenceEqual(profile.queues))
                            .FirstOrDefault() != null)
                        {
                            userProfiles.Where <UserSecurityProfile>(profile =>
                                                                     user.GetAttributeValue <EntityReference>("businessunitid").Name == profile.businessUnit &&
                                                                     userProfile.roles.SequenceEqual(profile.roles) &&
                                                                     userProfile.teams.SequenceEqual(profile.teams) &&
                                                                     userProfile.queues.SequenceEqual(profile.queues))
                            .FirstOrDefault().emails.Add(userProfile.emails[0]);
                        }
                        else
                        {
                            userProfiles.Add(userProfile);
                        }
                    }
                }

                jsonPayLoad = JsonConvert.SerializeObject(userProfiles);
            }
            catch (Exception e)
            {
                Console.WriteLine($"Failure to process Team security roles: {e.Message}");
            }
            return(jsonPayLoad);
        }
        public void ConfigureUser(UserSecurityProfile userModel)
        {
            foreach (var payloadUserEmail in userModel.emails)
            {
                var currentUser = this._users.FirstOrDefault(entity => entity.GetAttributeValue <string>("domainname").ToLower() == payloadUserEmail.ToLower());
                if (currentUser != null)
                {
                    var disabled = currentUser.GetAttributeValue <bool>("isdisabled");

                    if (!disabled)
                    {
                        //business unit
                        //business units are unique
                        var userBusinessUnitId   = currentUser.GetAttributeValue <EntityReference>("businessunitid").Id;
                        var userBusinessUnitName = this._businessUnits.FirstOrDefault(entity => entity.Id == userBusinessUnitId)
                                                   ?.GetAttributeValue <string>("name");


                        var moveToBusinessUnit = this._businessUnits.FirstOrDefault(bu =>
                                                                                    bu.GetAttributeValue <string>("name") == userModel.businessUnit);

                        //# assign user to business unit
                        if (moveToBusinessUnit != null && moveToBusinessUnit.Id != userBusinessUnitId)
                        {
                            SetCrmUserBusinessUnit(currentUser.Id, moveToBusinessUnit.Id);
                            currentUser["businessunitid"] = moveToBusinessUnit.Id;
                            userBusinessUnitId            = moveToBusinessUnit.Id;
                        }
                        else if (moveToBusinessUnit == null)
                        {
                            // Could not confirm user's expected business unit.
                        }

                        var userRoles = GetUserSecurityRoles(currentUser.Id);

                        //roles
                        //security roles have unique names
                        var rolesToRemove = userRoles.Where(item =>
                                                            userModel.roles.Contains(item.GetAttributeValue <string>("name")) == false).Distinct();

                        foreach (var role in rolesToRemove)
                        {
                            RemoveSecurityRoleFromUser(currentUser, role.Id);
                        }

                        var rolesToAdd = userModel.roles.Where(item =>
                                                               userRoles.FirstOrDefault(entity => item == entity.GetAttributeValue <string>("name")) == null).Distinct();

                        foreach (var role in rolesToAdd)
                        {
                            var roleId = this._roles.Where(item =>
                                                           item.GetAttributeValue <string>("name") == role && item.GetAttributeValue <EntityReference>("businessunitid").Id == userBusinessUnitId).Distinct();
                            AddSecurityRoleToUser(currentUser, roleId.First <Entity>().Id);
                        }

                        var userTeams = GetUserTeams(currentUser.Id);

                        //teams
                        var teamsToRemove = userTeams.Where(item =>
                                                            userModel.teams.Contains(item.GetAttributeValue <string>("name")) == false).Distinct();

                        foreach (var team in teamsToRemove)
                        {
                            RemoveUserFromTeam(currentUser, team.Id);
                        }

                        var teamsToAdd = userModel.teams.Where(item =>
                                                               userTeams.FirstOrDefault(entity => item == entity.GetAttributeValue <string>("name")) == null).Distinct();

                        foreach (var team in teamsToAdd)
                        {
                            var teamId = this._teams.Where(item =>
                                                           item.GetAttributeValue <string>("name") == team).Distinct();
                            AddUserToTeam(currentUser, teamId.First <Entity>().Id);
                        }

                        //need to get queues, but not include any where they are the owner (personal queues)
                        //also need to exclude queues that are attached to a default business unit

                        var userQueues = GetUserQueues(currentUser.Id);

                        var queuesToAdd = userModel.queues.Where(item =>
                                                                 userQueues.FirstOrDefault(entity => item == entity.GetAttributeValue <string>("name")) == null).Distinct();

                        foreach (var queue in queuesToAdd)
                        {
                            var queueId = this._queues.Where(item =>
                                                             item.GetAttributeValue <string>("name") == queue).Distinct();
                            AddUserToQueue(currentUser, queueId.First <Entity>().Id);
                        }

                        var queuesToRemove = userQueues.Where(item =>
                                                              userModel.queues.Contains(item.GetAttributeValue <string>("name")) == false &&
                                                              item.GetAttributeValue <AliasedValue>("team.name") == null &&
                                                              item.GetAttributeValue <EntityReference>("ownerid").Id != currentUser.Id
                                                              ).Distinct();

                        foreach (var queue in queuesToRemove)
                        {
                            RemoveUserFromQueue(currentUser, queue.Id);
                        }
                    }
                    else
                    {
                        //can we still remove all security roles etc in case they get reactivated?
                    }
                }
                else
                {
                    //couldnt find user
                }
            }
        }