public RequiredDataUserDto GetRequiredDataCreateUser()
        {
            var requiredDataDto = new RequiredDataUserDto();
            using (ConsoleRepository)
            {
                // 1. Get All TeamsMemberships
                var allTeamMemberships = ConsoleRepository.Query<Team>().ToList().Select(tm =>
                    {
                        return new TeamMembershipDto
                            {
                                Id = tm.Id,
                                EndDate = null,
                                StartDate = DateTime.Now,
                                Team = new TeamDto { Id = tm.Id, Title = tm.Title }
                            };

                    }).ToList();

                // 2. Get AllFilterCOBs 
                var allCOBs = ConsoleRepository.Query<COB>().ToList().Select(c =>
                    {
                        return new COBDto { Id = c.Id, Narrative = c.Narrative };

                    }).ToList();

                // 3. AllFilterOffices
                var allOffices = ConsoleRepository.Query<Office>().ToList().Select(o =>
                    {
                        return new OfficeDto { Id = o.Id, Title = o.Name };

                    }).ToList();

                // 4. AllFilterMembers
                var allUsers = ConsoleRepository.Query<User>().ToList().Select(u =>
                    {
                        return new UserDto { Id = u.Id, DomainLogon = u.DomainLogon };

                    }).ToList();

                requiredDataDto.AllTeamMemberships = allTeamMemberships;
                requiredDataDto.AllFilterCOBs = allCOBs;
                requiredDataDto.AllFilterOffices = allOffices;
                requiredDataDto.AllFilterMembers = allUsers;
                requiredDataDto.AllAdditionalCOBs = allCOBs;
                requiredDataDto.AllAdditionalOffices = allOffices;
                requiredDataDto.AllAdditionalUsers = allUsers;

                requiredDataDto.AllPrimaryOffices = allOffices;
                requiredDataDto.AllOriginatingOffices = allOffices;
                requiredDataDto.AllDefaultUnderwriters = allUsers;
            }

            return requiredDataDto;
        }
        //public static RequiredDataUserDto GetRequiredDataEditUser(string userName, IConsoleRepository _consoleRepository)
        //{
        //    var requiredDataDto = new RequiredDataUserDto();
        //    using (_consoleRepository)
        //    {
        //        var user = _consoleRepository.Query<User>(
        //                                    u => u.TeamMemberships.Select(t => t.Team);

        //        if (user == null)
        //            throw new Exception("User not Found"); // TODO: throw new NullReferenceException(user)

        //        var allTeams = _consoleRepository.Query<Team>().Select(t => t).ToList();

        //        var currentUserTeamMemberships =
        //            _consoleRepository.Query<TeamMembership>()
        //                              .Where(tm => tm.User.DomainLogon.Contains(userName) && tm.IsCurrent)
        //                              .Select(t => t.Team)
        //                              .ToList();

        //        var allTeamMemberships = allTeams.Except(currentUserTeamMemberships).Select(t =>
        //            {
        //                // Create a new empty team Membership
        //                return new TeamMembershipDto
        //                    {
        //                        Id = 0,
        //                        Team = new TeamDto {Id = t.Id, Title = t.Title},
        //                        EndDate = null,
        //                        StartDate = new DateTime()
        //                    };

        //            }).OrderBy(tm => tm.Team.Title).ToList();

                

        //        var allAdditionalUsers =
        //            _consoleRepository.Query<User>(u => true, u => u.TeamMemberships.Select(tm => tm.Team)).ToList().Except(currentAdditionalUsers).Select(u =>
        //                {
        //                    return new UserDto { Id = u.Id, DomainLogon = u.DomainLogon, TeamMemberships = u.TeamMemberships.Where(tm => tm.IsCurrent && tm.PrimaryTeamMembership).Select(tm => new TeamMembershipDto { Team = new TeamDto{Title = tm.Team.Title} }).ToList() };

        //                }).OrderBy(u => u.DomainLogon).ToList();

        //        requiredDataDto.AllTeamMemberships = allTeamMemberships;
                
        //        requiredDataDto.AllAdditionalUsers = allAdditionalUsers;
        //    }

        //    return requiredDataDto;
        //}

        public RequiredDataUserDto GetRequiredDataCreateUser()
        {
            var requiredDataDto = new RequiredDataUserDto();
            using (ConsoleRepository)
            {
                // 1. Get All TeamsMemberships
                var allTeamMemberships = ConsoleRepository.Query<Team>().OrderBy(t => t.Title).ToList().Select(tm =>
                    {
                        return new TeamMembershipDto
                            {
                                Id = tm.Id,
                                EndDate = null,
                                StartDate = DateTime.Now,
                                Team = new TeamDto { Id = tm.Id, Title = tm.Title }
                            };

                    }).ToList();

                

                // 4. AllFilterMembers
                var allUsers = ConsoleRepository.Query<User>(u => true, u => u.TeamMemberships.Select(tm => tm.Team)).OrderBy(u => u.DomainLogon).ToList().Select(u =>
                    {
                        return new UserDto { Id = u.Id, DomainLogon = u.DomainLogon, TeamMemberships = u.TeamMemberships.Where(tm => tm.IsCurrent && tm.PrimaryTeamMembership).Select(tm => new TeamMembershipDto { Team = new TeamDto { Title = tm.Team.Title } }).ToList() };

                    }).ToList();

                requiredDataDto.AllTeamMemberships = allTeamMemberships;
                
                requiredDataDto.AllFilterMembers = allUsers;
                
                requiredDataDto.AllAdditionalUsers = allUsers;

               
                requiredDataDto.AllDefaultUnderwriters = allUsers;
            }

            return requiredDataDto;
        }
        public static RequiredDataUserDto GetRequiredDataEditUser(string userName, IConsoleRepository _consoleRepository)
        {
            var requiredDataDto = new RequiredDataUserDto();
            using (_consoleRepository)
            {
                var user = _consoleRepository.Query<User>(u => u.FilterCOBs,
                                            u => u.FilterOffices,
                                            u => u.FilterMembers,
                                            u => u.AdditionalCOBs,
                                            u => u.AdditionalOffices,
                                            u => u.AdditionalUsers,
                                            u => u.OpenTabs,
                                            u => u.TeamMemberships.Select(t => t.Team),
                                            u => u.DefaultOrigOffice,
                                            u => u.DefaultUW,
                                            u => u.Underwriter,
                                            u => u.DefaultUW.Underwriter).FirstOrDefault(u => u.DomainLogon == userName);

                if (user == null)
                    throw new Exception("User not Found"); // TODO: throw new NullReferenceException(user)

                var allTeams = _consoleRepository.Query<Team>().Select(t => t).ToList();

                var currentUserTeamMemberships =
                    _consoleRepository.Query<TeamMembership>()
                                      .Where(tm => tm.User.DomainLogon.Contains(userName) && tm.IsCurrent)
                                      .Select(t => t.Team)
                                      .ToList();

                var allTeamMemberships = allTeams.Except(currentUserTeamMemberships).Select(t =>
                    {
                        // Create a new empty team Membership
                        return new TeamMembershipDto
                            {
                                Id = 0,
                                Team = new TeamDto {Id = t.Id, Title = t.Title},
                                EndDate = null,
                                StartDate = new DateTime()
                            };

                    }).OrderBy(tm => tm.Team.Title).ToList();

                // 2. Get AllFilterCOBs Except the ones that the user is already in
                var currentFilterCOBs = user.FilterCOBs.Select(fc => fc);

                var allFilterCOBs = _consoleRepository.Query<COB>().ToList().Except(currentFilterCOBs).Select(c =>
                    {
                        return new COBDto { Id = c.Id, Narrative = c.Narrative };

                    }).OrderBy(cob => cob.Narrative).ToList();

                // 3. AllFilterOffices
                var currentFilterOffices = user.FilterOffices.Select(fo => fo);

                var allFilterOffices =
                    _consoleRepository.Query<Office>().ToList().Except(currentFilterOffices).Select(o =>
                        {
                            return new OfficeDto { Id = o.Id, Title = o.Name };

                        }).OrderBy(o => o.Title).ToList();

                // 4. AllFilterMembers
                var currentFilterMembers = user.FilterMembers.Select(fm => fm);

                var allFilterMembers =
                    _consoleRepository.Query<User>().ToList().Except(currentFilterMembers).Select(u =>
                        {
                            return new UserDto { Id = u.Id, DomainLogon = u.DomainLogon };

                        }).OrderBy(u => u.DomainLogon).ToList();

                // 5. AllAdditionalCOBs
                var currentAdditionalCOBs = user.AdditionalCOBs.Select(ac => ac);

                var allAdditionalCOBs =
                    _consoleRepository.Query<COB>().ToList().Except(currentAdditionalCOBs).Select(c =>
                        {
                            return new COBDto { Id = c.Id, Narrative = c.Narrative };

                        }).OrderBy(cob => cob.Narrative).ToList();

                // 6. AllAdditionalOffices
                var currentAdditionalOffices = user.AdditionalOffices.Select(ao => ao);

                var allAdditionalOffices =
                    _consoleRepository.Query<Office>().ToList().Except(currentAdditionalOffices).Select(o =>
                        {
                            return new OfficeDto { Id = o.Id, Title = o.Name };

                        }).OrderBy(o => o.Title).ToList();

                // 7. AllAdditionalUsers 
                var currentAdditionalUsers = user.AdditionalUsers.Select(au => au);

                var allAdditionalUsers =
                    _consoleRepository.Query<User>().ToList().Except(currentAdditionalUsers).Select(u =>
                        {
                            return new UserDto { Id = u.Id, DomainLogon = u.DomainLogon };

                        }).OrderBy(u => u.DomainLogon).ToList();

                requiredDataDto.AllTeamMemberships = allTeamMemberships;
                requiredDataDto.AllFilterCOBs = allFilterCOBs;
                requiredDataDto.AllFilterOffices = allFilterOffices;
                requiredDataDto.AllFilterMembers = allFilterMembers;
                requiredDataDto.AllAdditionalCOBs = allAdditionalCOBs;
                requiredDataDto.AllAdditionalOffices = allAdditionalOffices;
                requiredDataDto.AllAdditionalUsers = allAdditionalUsers;
            }

            return requiredDataDto;
        }