private async Task sendResetPasswordEmail(UserAccount currentUser)
        {
            // generate new token string
            var tokenString = await userManager.GeneratePasswordResetTokenAsync(currentUser);


            // generate url from action -- controller -- route values
            var confirmationUrl = Url.Action(
                nameof(ResetPasswordEmail), "Account",
                new { token = tokenString, email = currentUser.Email },
                Request.Scheme
                );


            /* create the mail content */
            var emailMessage = new MailkitMessage
            {
                Subject  = "aov-shop.tk - Đặt lại Mật khẩu",
                Content  = confirmationUrl,
                Sender   = new MailboxAddress(mailkitMetadata.Sender),
                Receiver = new MailboxAddress(currentUser.Email)
            };



            using (SmtpClient smtpClient = new SmtpClient())
            {
                smtpClient.Connect(mailkitMetadata.SmtpServer, mailkitMetadata.Port);
                smtpClient.Authenticate(mailkitMetadata.UserName, mailkitMetadata.Password);
                smtpClient.Send(emailMessage.GetResetPasswordMimeMessage());
                smtpClient.Disconnect(true);
            }
        }
        public async Task <IActionResult> SignUp(SignUpViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                var client = await userManager.FindByEmailAsync(viewModel.Email);

                if (client != null)
                {
                    TempData["message"] = "E-mail đã tồn tại";
                }
                else
                {
                    // init new Client model --> create  --- here the client is null
                    client = new UserAccount {
                        Email     = viewModel.Email,
                        SurName   = viewModel.User.SurName,
                        FirstName = viewModel.User.FirstName
                    };


                    var createResult = await userManager.CreateAsync(client, viewModel.Password);

                    if (createResult.Succeeded)
                    {
                        var roleExisted = true;

                        /* check and add new role if needed */
                        if (await roleManager.RoleExistsAsync(Constants.ClientRole) == false)
                        {
                            var createRoleResult = await roleManager.CreateAsync(new IdentityRole(Constants.ClientRole));

                            roleExisted = createRoleResult.Succeeded == true;
                        }



                        if (roleExisted)
                        {
                            var addRoleResult = await userManager.AddToRoleAsync(client, Constants.ClientRole);

                            if (addRoleResult.Succeeded)
                            {
                                /* generate confirmationUrl that will be contained in the email */
                                var tokenString = await userManager.GenerateEmailConfirmationTokenAsync(client);

                                var confirmationUrl = Url.Action(
                                    nameof(ConfirmEmail),
                                    "Account",
                                    new { token = tokenString, email = client.Email },
                                    Request.Scheme
                                    );


                                /* send the mail */
                                var emailMessage = new MailkitMessage
                                {
                                    Subject  = "aov-shop.tk - Xác minh Tài khoản",
                                    Content  = confirmationUrl,
                                    Sender   = new MailboxAddress(mailkitMetadata.Sender),
                                    Receiver = new MailboxAddress(client.Email)
                                };



                                using (SmtpClient smtpClient = new SmtpClient())
                                {
                                    smtpClient.Connect(mailkitMetadata.SmtpServer, mailkitMetadata.Port);
                                    smtpClient.Authenticate(mailkitMetadata.UserName, mailkitMetadata.Password);
                                    smtpClient.Send(emailMessage.GetConfirmEmailMimeMessage());
                                    smtpClient.Disconnect(true);
                                }


                                TempData["message"] = "Vui lòng kiểm tra E-mail để kích hoạt !";
                                return(RedirectToAction(nameof(Login)));
                            } //  addRole
                        }     // roleExisted


                        TempData["message"] = "Có lỗi trong quá trình Đăng ký !";
                        return(View());
                    }
                    else
                    {
                        if (createResult.Errors.Any(err => err.Code == "PasswordTooShort"))
                        {
                            TempData["message"] = "Mật khẩu phải có ít nhất 6 kí tự";
                        }
                        else
                        {
                            TempData["message"] = "Có lỗi trong quá trình Đăng ký";
                        }
                    }
                }
            }
            else
            {
                TempData["message"] = "Thông tin Đăng ký không hợp lệ";
            }


            return(View(viewModel));
        }