public async Task <IActionResult> SendTotpCode(SendTotpCodeViewModel viewModel)
        {
            if (_signInManager.IsSignedIn(User))
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (ModelState.IsValid)
            {
                // Show expire time for user
                if (TempData.ContainsKey("PTC"))
                {
                    var totpTempDataModel = JsonSerializer
                                            .Deserialize <PhoneTotpTempDataModel>(TempData["PTC"].ToString() !);

                    if (totpTempDataModel.ExpireTime >= DateTime.Now)
                    {
                        // returns a expire time as int for show in View
                        var differenceInSeconds = (int)(totpTempDataModel.ExpireTime - DateTime.Now).TotalSeconds;
                        ModelState.AddModelError("PhoneNumber", $"برای ارسال دوباره کد لطفا {differenceInSeconds} ثانیه صبرکنید.");
                        // For keep temp data after calling
                        TempData.Keep("PTC");
                        return(View(viewModel));
                    }
                }

                var secretKey = Guid.NewGuid().ToString();
                var totpCode  = _phoneTotpProvider.GenerateTotp(secretKey);
                var userExist = await _userManager.Users
                                .AnyAsync(user => user.PhoneNumber == viewModel.PhoneNumber);

                if (userExist)
                {
                    // TODO - Send Totp Code to user.
                }

                // Convert model to json as string
                TempData["PTC"] = JsonSerializer.Serialize(new PhoneTotpTempDataModel()
                {
                    SecretKey   = secretKey,
                    PhoneNumber = viewModel.PhoneNumber,
                    ExpireTime  = DateTime.Now.AddSeconds(_phoneTotpOptions.StepInSeconds)
                });

                // return RedirectToAction("VerifyTotpCode", "Account");
                return(Content(totpCode));
            }

            ViewData["SendTotpCodeErrorMessage"] = null;
            return(View(viewModel));
        }
        public async Task <IActionResult> SendTotpCode(SendTotpCodeViewModel model)
        {
            if (_signInManager.IsSignedIn(User))
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (ModelState.IsValid)
            {
                var secretKey = Guid.NewGuid().ToString();
                var totpCode  = _phoneTotpProvider.GenerateTotp(secretKey);

                var userExists = await _userManager.Users
                                 .AnyAsync(user => user.PhoneNumber == model.PhoneNumber);

                if (userExists)
                {
                    //TODO send totpCode to user.
                }


                //RedirectToAction("VerifyTotpCode");
                //return Content(totpCode);

                try
                {
                    if (TempData.ContainsKey("PTC"))
                    {
                        var totpTempDataModel = JsonSerializer.Deserialize <PhoneTotpTempDataModel>(TempData["PTC"].ToString() !);
                        if (totpTempDataModel.ExpirationTime >= DateTime.Now)
                        {
                            var differenceInSeconds = (int)(totpTempDataModel.ExpirationTime - DateTime.Now).TotalSeconds;
                            ModelState.AddModelError("", $"برای ارسال دوباره کد، لطفا {differenceInSeconds} ثانیه صبر کنید.");
                            TempData.Keep("PTC");
                            return(View());
                        }
                        return(View());
                    }


                    TempData["PTC"] = JsonSerializer.Serialize(new PhoneTotpTempDataModel()
                    {
                        SecretKey      = secretKey,
                        PhoneNumber    = model.PhoneNumber,
                        ExpirationTime = DateTime.Now.AddSeconds(_phoneTotpOptions.StepInSeconds)
                    });

                    var dd = _userManager.Users.Single(a => a.PhoneNumber == model.PhoneNumber);


                    if (model.PhoneNumber == dd.PhoneNumber)
                    {
                        var user = await _Shopingcontex.Users.Where(u => u.PhoneNumber == model.PhoneNumber)
                                   .SingleOrDefaultAsync();

                        user.PhoneNumberConfirmed = false;
                        user.DateTime             = DateTime.Now;
                        user.PasswordHash         = model.Password;
                        user.codeconfig           = totpCode;
                        await _Shopingcontex.SaveChangesAsync();

                        return(RedirectToAction("Register"));
                    }
                }
                catch
                {
                    var user = new ApplicationUser()
                    {
                        UserName             = model.PhoneNumber,
                        PhoneNumber          = model.PhoneNumber,
                        PhoneNumberConfirmed = false,
                        DateTime             = DateTime.Now,
                        codeconfig           = totpCode,
                    };

                    var result = await _userManager.CreateAsync(user, model.Password);

                    if (result.Succeeded)
                    {
                        return(RedirectToAction("Register"));
                    }

                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError("", error.Description);
                    }
                }
                return(View(model));
            }

            return(View());

            ;
        }