/// <summary>
        /// Saves the registration information.
        /// </summary>
        /// <param name="registrationInfo">The registration information.</param>
        /// <param name="registrationId">The registration identifier.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">registrationInfo</exception>
        /// string SaveRegistrationInfo(IRegistrationView registrationInfo, out int registrationId);
        public string SaveRegistrationInfo(IUserAgentofDeductionView registrationInfo, out int registrationId)
        {
            if (registrationInfo == null)
            {
                throw new ArgumentNullException(nameof(registrationInfo));
            }

            var result    = string.Empty;
            var newRecord = new UserRegistration
            {
                Password       = registrationInfo.Password,
                FirstName      = registrationInfo.FirstName,
                Email          = registrationInfo.Email,
                DateVerified   = DateTime.Now,
                LastName       = registrationInfo.LastName,
                IsActive       = registrationInfo.IsActive,
                PhoneNumber    = registrationInfo.PhoneNumber,
                DateCreated    = DateTime.Now,
                IsUserVerified = false
            };

            using (
                var dbContext = (PitalyticsEntities)dbContextFactory.GetDbContext())
            {
                dbContext.UserRegistrations.Add(newRecord);
                dbContext.SaveChanges();
            }
            registrationId = newRecord.UserRegistrationId;
            return(result);

            ;
        }
        /// <summary>
        /// Gets the updated registration view.
        /// </summary>
        /// <param name="userAgentofDeductionView">The user agentof deduction view.</param>
        /// <param name="processingMessage">The processing message.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">userAgentofDeductionView</exception>
        public IUserAgentofDeductionView GetUpdatedRegistrationView(IUserAgentofDeductionView userAgentofDeductionView, string processingMessage)
        {
            if (userAgentofDeductionView == null)
            {
                throw new ArgumentNullException(nameof(userAgentofDeductionView));
            }
            var industry = this.generalRepository.GetIndustry().Where(x => x.IsActive = true).ToList();

            return(this.accountViewsModelFactory.CreateUpdatedRegistraionView(userAgentofDeductionView, processingMessage, industry));
        }
        /// <summary>
        /// Creates the updated registraion view.
        /// </summary>
        /// <param name="registrationInfo">The registration information.</param>
        /// <param name="processingMessage">The processing message.</param>
        /// <param name="aboutUsSourceCollection">The about us source collection.</param>
        /// <returns></returns>
        public IUserAgentofDeductionView CreateUpdatedRegistraionView(IUserAgentofDeductionView userAgentofDeductionView, string processingMessage, IList <IIndustry> industries)
        {
            if (userAgentofDeductionView == null)
            {
                throw new ArgumentNullException(nameof(userAgentofDeductionView));
            }
            var industryDDl = GetIndustryDropDownList.GetIndustry(industries, userAgentofDeductionView.IndustryId);

            userAgentofDeductionView.ProcessingMessage = processingMessage;
            userAgentofDeductionView.IndustryList      = industryDDl;
            return(userAgentofDeductionView);
        }
        /// <summary>
        /// Saves the agentof deduction information.
        /// </summary>
        /// <param name="agentOfDeductionView">The agent of deduction view.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">agentOfDeductionView</exception>
        public string saveAgentofDeductionInfo(IUserAgentofDeductionView agentOfDeductionView, int registrationId)
        {
            if (agentOfDeductionView == null)
            {
                throw new ArgumentNullException(nameof(agentOfDeductionView));
            }

            var result    = string.Empty;
            var newRecord = new AgentOfDeductionInfo
            {
                BVN         = agentOfDeductionView.BVN,
                CACRegNo    = agentOfDeductionView.CACRegNo,
                CompanyName = agentOfDeductionView.CompanyName,
                DateCreated = DateTime.Now,

                FIRS_TIN           = agentOfDeductionView.FIRS_TIN,
                IndustryId         = agentOfDeductionView.IndustryId,
                IsActive           = true,
                IsVerified         = false,
                UserRegistrationId = registrationId,
                WebsiteAddress     = agentOfDeductionView.WebsiteAddress,
            };

            try
            {
                using (
                    var dbContext = (PitalyticsEntities)dbContextFactory.GetDbContext())
                {
                    dbContext.AgentOfDeductionInfoes.Add(newRecord);
                    dbContext.SaveChanges();
                }
            }
            catch (Exception e)
            {
                throw new Exception($"Save Agent of Deduction - {e.Message} , {(e.InnerException != null ? e.InnerException.Message : "")}");
            }



            return(result);

            ;
        }
        /// <summary>
        /// Processes the registration information.
        /// </summary>
        /// <param name="registrationInfo">The registration information.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">registrationInfo</exception>
        public IUserAgentofDeductionView ProcessAgentofDeductionRegistrationInfo(IUserAgentofDeductionView userAgentofDeductionView)
        {
            if (userAgentofDeductionView == null)
            {
                throw new System.ArgumentNullException(nameof(userAgentofDeductionView));
            }

            var processingMessage = string.Empty;
            var isDataOkay        = true;

            //checks if similar email does exist in the database
            var registrationData = this.accountRepository.GetRegistrationByEmail(userAgentofDeductionView.Email);
            var IsRecordExist    = (registrationData != null);

            if (IsRecordExist)
            {
                isDataOkay        = false;
                processingMessage = Messages.IsEmailExist;
            }
            else
            {
                var companyData = this.accountRepository.GetAgentOfDeductionByCacNumber(userAgentofDeductionView.CACRegNo);

                if (companyData != null)
                {
                    isDataOkay        = false;
                    processingMessage = Messages.CompanyExist;
                }
            }


            var industry        = this.generalRepository.GetIndustry().Where(x => x.IsActive == true).ToList();
            var returnViewModel =
                this.accountViewsModelFactory.CreateUpdatedRegistraionView(userAgentofDeductionView, processingMessage, industry);


            if (!isDataOkay)
            {
                return(returnViewModel);
            }

            //save data to database
            var registrationId = 0;

            userAgentofDeductionView.Password = this.encryptionService.Encrypt(userAgentofDeductionView.Password);

            userAgentofDeductionView.FirstName = userAgentofDeductionView.FirstName == null ? userAgentofDeductionView.CompanyName : userAgentofDeductionView.FirstName;
            userAgentofDeductionView.IsActive  = false;
            var savedData = this.accountRepository.SaveRegistrationInfo(userAgentofDeductionView, out registrationId);


            var saveInfo = this.accountRepository.saveAgentofDeductionInfo(userAgentofDeductionView, registrationId);

            var getRole = this.accountRepository.GetAdminRoleUserRoles(EnvironmentValues.AgentOfDeduction);

            //
            this.accountRepository.CreateUserRole(userAgentofDeductionView.Email, getRole.AdminRoleId);

            if (savedData == string.Empty)
            {
                //Send activation Link to the User,
                //Genenrate Activation Code
                var activationCode = CodeGenerators.GenerateActivationCode();

                //Get The registered User Information
                var user = this.accountRepository.GetRegistrationByEmail(userAgentofDeductionView.Email);

                //Pass the Code and the user ID to store to Database
                var result = this.accountRepository.SaveUserActivationCode(user.UserRegistrationId, activationCode);


                // email send implementation here
                var emailDetail =
                    this.emailFactory.CreateRegistrationRequestEmail(userAgentofDeductionView.Email, userAgentofDeductionView.FirstName,
                                                                     activationCode); //999 is the registrationId from database

                var emailKey = this.environment[EnvironmentValues.EmailKey];

                this.emailService.Send(emailKey, "*****@*****.**", "Pitalytics Team", emailDetail.Subject,
                                       emailDetail.Recipients, emailDetail.Recipients, "", emailDetail.Body);
            }


            return(returnViewModel);
        }