internal async Task <ResultBundle> RegisterUser(string originalCaptcha, DALContext context, IEmailSender _emailSender, string host)
        {
            var r = Validate(originalCaptcha);

            //  have to del session for Captcha   http://www.dotnettips.info/post/1809/%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%da%a9%d9%be%da%86%d8%a7%db%8c%db%8c-captcha-%d8%b3%d8%b1%db%8c%d8%b9-%d9%88-%d8%b3%d8%a7%d8%af%d9%87-%d8%af%d8%b1-asp-net-mvc-5
            if (r.IsSuccessful)
            {
                var user = context.SearchForUserByEmailAddress(EmailAddress);

                if (user != null)
                {
                    r.AddMessage("آدرس ایمیل وارد شده قبلا برای کاربر دیگری ثبت شده است. اگر رمز عبور خود را فراموش کرده اید از طریق صفحه (ورود) اقدام به بازیابی آن نمایید.");
                    r.IsSuccessful = false;
                }
                else
                {
                    string key = Guid.NewGuid().ToString();

                    string keyUrl    = string.Format("{0}/Account/ConfirmEmailAddress/{1}", host, key);
                    bool   emailSent = await _emailSender.SendEmailConfirmationForm(EmailAddress, keyUrl);

                    if (!emailSent)
                    {
                        r.AddMessage("آدرس ایمیل وارد شده معتبر نمی باشد. امکان ثبت نام با این ایمیل وجود ندارد.");
                        r.IsSuccessful = false;
                    }
                    else
                    {
                        string hashPassword = Utils.GenerateHashPassword(Password);
                        if (!await AddLogin(context, hashPassword, key))
                        {
                            r.AddMessage("خطایی در هنگام ذخیره اطلاعات شما در دیتابیس رخ داده است لطفا مجددا تلاش کنید.");
                            r.IsSuccessful = false;
                        }
                        else
                        {
                            // Registeration is accepted
                            r.UserData = context.Login(EmailAddress, hashPassword);
                        }
                    }
                }
            }

            return(r);
        }