/// <summary>
        /// Verifies the member details.
        /// </summary>
        /// <param name="memberRegistration">The member registration.</param>
        /// <param name="externalId">The external identifier.</param>
        /// <param name="statusCode">The status code.</param>
        /// <returns></returns>
        private async Task <MemberRegistrationVerification> VerifyMemberDetails(MemberRegistrationBO memberRegistration, string externalId, MemberRegistrationVerification statusCode)
        {
            var memberRepo          = _unitOfWork.GetRepository <Member>();
            var memberDependentRepo = _unitOfWork.GetRepository <MemberDependent>();
            var memberDetailsRepo   = _unitOfWork.GetRepository <MemberDetail>();

            MemberDependent memDependentDetails;
            var             memDetails = await memberRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.Admin123Id == externalId);

            if (memDetails == null)
            {
                memDetails = await memberRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.ExternalId == externalId);

                memDependentDetails = await memberDependentRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.ExternalId == externalId);
            }
            else
            {
                memDependentDetails = await memberDependentRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.Admin123Id == externalId);
            }

            if (memDetails != null)
            {
                statusCode = memDetails.UserId != null ?
                             MemberRegistrationVerification.ExistingMember : MemberRegistrationVerification.Verified;

                if (statusCode == MemberRegistrationVerification.Verified)
                {
                    memberRegistration.MemberId = memDetails.MemberId;
                    memDetails.UserId           = memberRegistration.UserId;
                    memberRepo.Update(memDetails);
                }
            }
            else if (memDependentDetails != null)
            {
                statusCode = memDependentDetails.UserId != null ?
                             MemberRegistrationVerification.ExistingMember : MemberRegistrationVerification.Verified;

                if (statusCode == MemberRegistrationVerification.Verified)
                {
                    memberRegistration.MemberId = memDependentDetails.MemberId;
                    memDependentDetails.UserId  = memberRegistration.UserId;
                    memberDependentRepo.Update(memDependentDetails);
                }
            }

            return(statusCode);
        }
        /// <summary>
        /// Verifies the member details.
        /// </summary>
        /// <param name="memberRegBO">The member reg bo.</param>
        /// <param name="statusCode">The status code.</param>
        /// <param name="externalId">The external identifier.</param>
        /// <returns></returns>
        private async Task <Tuple <MemberRegistrationVerification, string, string> > VerifyMemberDetails(MemberRegistrationBO memberRegBO, MemberRegistrationVerification statusCode, string externalId)
        {
            DateTime?       dateOfBirth         = memberRegBO.Dob;
            var             memberRepo          = _unitOfWork.GetRepository <Member>();
            var             memberDependentRepo = _unitOfWork.GetRepository <MemberDependent>();
            var             memberDetailsRepo   = _unitOfWork.GetRepository <MemberDetail>();
            MemberDependent memberDependentDetails;
            var             phoneNUmber = string.Empty;
            var             emailId     = string.Empty;

            var memDetails = await memberRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.Admin123Id == externalId);

            if (memDetails == null)
            {
                memDetails = await memberRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.ExternalId == externalId);

                memberDependentDetails = await memberDependentRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.ExternalId == externalId);
            }
            else
            {
                memberDependentDetails = await memberDependentRepo.GetFirstOrDefaultAsync(a => a, predicate : b => b.Admin123Id == externalId);
            }

            if (memDetails != null)
            {
                statusCode = memDetails.UserId != null ? MemberRegistrationVerification.ExistingMember : MemberRegistrationVerification.ValidMemberId;

                //if valid memberId
                if (statusCode != MemberRegistrationVerification.ExistingMember)
                {
                    var memAddress = await _unitOfWork.GetRepository <MemberAddress>().GetFirstOrDefaultAsync(a => a,
                                                                                                              predicate: b => b.MemberId == memDetails.MemberId);

                    var memberDetails = await _unitOfWork.GetRepository <MemberDetail>().GetFirstOrDefaultAsync(a => a,
                                                                                                                predicate: b => b.MemberDetailId == memDetails.MemberDetailId);

                    if (memAddress != null && memberDetails != null)
                    {
                        var memberDetailsResponse = await memberDetailsRepo.GetFirstOrDefaultAsync(a => a,
                                                                                                   predicate : b => b.MemberDetailId == memDetails.MemberDetailId && b.DateOfBirth.Date == dateOfBirth.Value.Date &&
                                                                                                   b.FirstName.ToLower().Trim() == memberRegBO.FirstName.ToLower().Trim() &&
                                                                                                   b.LastName.ToLower().Trim() == memberRegBO.LastName.ToLower().Trim() &&
                                                                                                   memAddress.ZipCode == memberRegBO.ZipCode);

                        statusCode = memberDetailsResponse != null ? MemberRegistrationVerification.Verified : MemberRegistrationVerification.InvalidDetails;

                        if (statusCode.Equals(MemberRegistrationVerification.Verified))
                        {
                            //phoneNumber or email null check and validation if value is not null
                            var errorStatusCode = memberDetails.PhoneNumber == null && memberDetails.EmailId == null ?
                                                  MemberRegistrationVerification.EmailIdAndPhoneNumberAreEmpty :
                                                  (memberDetails.EmailId == null ? MemberRegistrationVerification.EmailIdEmpty :
                                                   (memberDetails.PhoneNumber == null ? MemberRegistrationVerification.PhoneNumberEmpty : statusCode));

                            phoneNUmber = !string.IsNullOrEmpty(memberDetailsResponse.PhoneNumber) ?
                                          memberDetailsResponse.PhoneNumber.Substring(7, 3).PadLeft(10, '*') : null;
                            emailId = !string.IsNullOrEmpty(memberDetailsResponse.EmailId) ?
                                      (memberDetailsResponse.EmailId.Split('@')[0].Substring(0, 2)
                                       + new string('*', memberDetailsResponse.EmailId.Split('@')[0].Length - 2)
                                       + "@"
                                       + memberDetailsResponse.EmailId.Split('@')[1]) : null;

                            if (errorStatusCode != MemberRegistrationVerification.EmailIdAndPhoneNumberAreEmpty)
                            {
                                statusCode = (memberDetailsResponse.EmailId.ToLower() != memberRegBO.Email.ToLower() &&
                                              memberDetailsResponse.PhoneNumber != memberRegBO.PhoneNumber) ?
                                             MemberRegistrationVerification.InvalidEmailIdAndPhoneNumber :
                                             (memberDetailsResponse.EmailId.ToLower() != memberRegBO.Email.ToLower() ? MemberRegistrationVerification.InvalidEmailId :
                                              (memberDetailsResponse.PhoneNumber != memberRegBO.PhoneNumber ? MemberRegistrationVerification.InvalidPhoneNumber :
                                               MemberRegistrationVerification.Verified));

                                statusCode = (errorStatusCode == MemberRegistrationVerification.EmailIdEmpty &&
                                              statusCode == MemberRegistrationVerification.InvalidPhoneNumber) ?
                                             MemberRegistrationVerification.EmailIdEmptyAndInvalidPhoneNumber :
                                             ((errorStatusCode == MemberRegistrationVerification.PhoneNumberEmpty &&
                                               statusCode == MemberRegistrationVerification.InvalidEmailId) ?
                                              MemberRegistrationVerification.PhoneNumberEmptyAndInvalidEmailId : statusCode);
                            }
                        }
                    }
                    else
                    {
                        statusCode = MemberRegistrationVerification.InvalidDetails;
                    }
                }
            }
            else if (memberDependentDetails != null)
            {
                statusCode = memberDependentDetails.UserId != null ? MemberRegistrationVerification.ExistingMember : MemberRegistrationVerification.ValidMemberId;

                //if valid memberId
                if (statusCode != MemberRegistrationVerification.ExistingMember)
                {
                    var memAddress = await _unitOfWork.GetRepository <MemberAddress>().GetFirstOrDefaultAsync(a => a,
                                                                                                              predicate: b => b.MemberId == memberDependentDetails.MemberId);

                    var dependentDetails = await _unitOfWork.GetRepository <MemberDetail>().GetFirstOrDefaultAsync(a => a,
                                                                                                                   predicate: b => b.MemberDetailId == memberDependentDetails.MemberDetailId);

                    if (memAddress != null)
                    {
                        var memberDependentDetailsResponse = await memberDetailsRepo.GetFirstOrDefaultAsync(a => a,
                                                                                                            predicate : b => b.DateOfBirth.Date == dateOfBirth.Value.Date &&
                                                                                                            b.MemberDetailId == memberDependentDetails.MemberDetailId && b.FirstName == memberRegBO.FirstName &&
                                                                                                            b.LastName == memberRegBO.LastName && memAddress.ZipCode == memberRegBO.ZipCode);

                        statusCode = memberDependentDetailsResponse != null ? MemberRegistrationVerification.Verified :
                                     MemberRegistrationVerification.InvalidDetails;

                        if (statusCode.Equals(MemberRegistrationVerification.Verified))
                        {
                            //phoneNumber or email null check and validation if value is not null
                            var errorStatusCode = dependentDetails.PhoneNumber == null && dependentDetails.EmailId == null ?
                                                  MemberRegistrationVerification.EmailIdAndPhoneNumberAreEmpty :
                                                  (dependentDetails.EmailId == null ? MemberRegistrationVerification.EmailIdEmpty :
                                                   (dependentDetails.PhoneNumber == null ? MemberRegistrationVerification.PhoneNumberEmpty : statusCode));

                            phoneNUmber = memberDependentDetailsResponse.PhoneNumber;
                            emailId     = memberDependentDetailsResponse.EmailId;

                            if (errorStatusCode != MemberRegistrationVerification.EmailIdAndPhoneNumberAreEmpty)
                            {
                                statusCode = (memberDependentDetailsResponse.EmailId.ToLower() != memberRegBO.Email.ToLower() &&
                                              memberDependentDetailsResponse.PhoneNumber != memberRegBO.PhoneNumber) ?
                                             MemberRegistrationVerification.InvalidEmailIdAndPhoneNumber :
                                             (memberDependentDetailsResponse.EmailId.ToLower() != memberRegBO.Email.ToLower() ?
                                              MemberRegistrationVerification.InvalidEmailId : (memberDependentDetailsResponse.PhoneNumber != memberRegBO.PhoneNumber ?
                                                                                               MemberRegistrationVerification.InvalidPhoneNumber : MemberRegistrationVerification.Verified));

                                statusCode = (errorStatusCode == MemberRegistrationVerification.EmailIdEmpty &&
                                              statusCode == MemberRegistrationVerification.InvalidPhoneNumber) ?
                                             MemberRegistrationVerification.EmailIdEmptyAndInvalidPhoneNumber :
                                             ((errorStatusCode == MemberRegistrationVerification.PhoneNumberEmpty &&
                                               statusCode == MemberRegistrationVerification.InvalidEmailId) ?
                                              MemberRegistrationVerification.PhoneNumberEmptyAndInvalidEmailId : statusCode);
                            }
                        }
                    }
                    else
                    {
                        statusCode = MemberRegistrationVerification.InvalidDetails;
                    }
                }
            }

            return(Tuple.Create(statusCode, phoneNUmber, emailId));
        }