public ActionResult RegisterFacebook(RegisterFacebookModel model)
        {
            if (!ModelState.IsValid || Members.IsLoggedIn() || string.IsNullOrEmpty(model.Email))
            {
                return(PartialView("Profile/RegisterFacebook", model));
            }

            var memberService    = Services.MemberService;
            var checkMemberEmail = Services.MemberService.GetByEmail(model.Email);

            if (checkMemberEmail != null)
            {
                ModelState.AddModelError("FormGenericError", "The email already in use!");
                return(PartialView("Profile/RegisterFacebook", model));
            }

            // check if username unique
            if (Services.MemberService.GetByUsername(model.Username.Trim().ToLower()) != null)
            {
                ModelState.AddModelError("FormGenericError", "Το username χρησιμοποιείται ήδη από άλλο μέλος, επιλέξτε ένα άλλο.");
                return(PartialView("Profile/RegisterFacebook", model));
            }

            // last check FB
            var client = new Facebook.FacebookClient(model.AccessToken);

            if (client != null)
            {
                var userDetail = client.Get("/me", new { fields = "last_name,id,email,name,birthday,age_range,middle_name,first_name,locale,verified" });
                if (userDetail != null)
                {
                    var loginDetail = new FacebookLoginDetail(JObject.FromObject(userDetail), model.AccessToken);
                    if (loginDetail == null || loginDetail.UserId != model.FacebookUserId)
                    {
                        ModelState.AddModelError("FormGenericError", "Κάντε Login στο Facebook με τον δικό σας λογαριασμό και ξαναδοκιμάστε!");
                        return(PartialView("Profile/RegisterFacebook", model));
                    }

                    if (loginDetail == null
#if !DEBUG
                        || !loginDetail.IsFacebookVerified
#endif
                        )
                    {
                        ModelState.AddModelError("FormGenericError", "Πρέπει να έχετε επιβεβαιώση τον λογαριασμό σας στο Facebook ώστε να κάνετε την εγγραφή σας.");
                        return(PartialView("Profile/RegisterFacebook", model));
                    }

                    if (string.Compare(loginDetail.Username, model.Username, true) != 0 &&
                        string.Compare(loginDetail.Email, model.Email, true) != 0)
                    {
                        ModelState.AddModelError("FormGenericError",
                                                 "Μπορείτε να αλλάξετε μόνο είτε το email σας, είτε το username σας όταν κάνετε εγγραφή μέσω Facebook.");
                        return(PartialView("Profile/RegisterFacebook", model));
                    }

                    // assign correct userid.
                    model.FacebookUserId = loginDetail.UserId;
                }
            }
            else
            {
                // could not logon server side
                ModelState.AddModelError("FormGenericError", "Παρακάλω κάντε login στο Facebook πρώτα ώστε να προχωρήσετε με την εγγραφή σας στο site.");
                return(PartialView("Profile/RegisterFacebook", model));
            }

            // check if user exists as a facebook user already.
            if (!string.IsNullOrEmpty(model.FacebookUserId))
            {
                var existingMember = Services.MemberService.GetMembersByPropertyValue("facebookUserId", model.FacebookUserId).FirstOrDefault();
                if (existingMember != null && existingMember.IsApproved)
                {
                    // log him in.
                    Members.Login(existingMember.Username, model.FacebookUserId);
                    return(RedirectToCurrentUmbracoPage());
                }
            }

            // all good!, create the member
            try
            {
                var curPage   = Umbraco.TypedContent(model.Cpid);
                var culture   = curPage.GetCulture();
                var newMember = memberService.CreateMember(model.Username.Trim(), model.Email.Trim(), $"{model.Surname.Trim()} {model.Name.Trim()}", Constants.MemberAlias);
                if (newMember == null)
                {
                    ModelState.AddModelError("FormGenericError", "Κάποιο σοβαρό σφάλμα προεκυψε. Προσπαθήστε ξανά!");
                    LogHelper.Warn(typeof(AuthSurfaceController), $"Cannot create new Facebook member: {model.Email}");
                    return(PartialView("Profile/RegisterFacebook", model));
                }
                // Membership properties
                newMember.SetValue("emailVerifyHash", "ok");
                newMember.SetValue("hasVerifiedEmail", true);
                newMember.IsApproved = true;
                newMember.SetValue("facebookUserId", model.FacebookUserId);
                newMember.SetValue("memberisOver18", true);
                Services.MemberService.Save(newMember);
                Services.MemberService.SavePassword(newMember, model.FacebookUserId);

                // assign member to group in order to see profile page
                var memberRoles = Services.MemberService.GetAllRoles(newMember.Id);
                if (!memberRoles.Any(z => string.Compare(z, Constants.VerifiedMemberGroup, true) == 0))
                {
                    Services.MemberService.AssignRole(newMember.Id, Constants.VerifiedMemberGroup);
                }

                //Services.MemberService.Save(newMember);
                if (!Members.Login(newMember.Username, model.FacebookUserId))
                {
                    ModelState.AddModelError("FormGenericError", "Συνέβη κάποιο σοβαρό σφάλμα. Παρακαλώ προσπαθήστε ξάνα.");
                    LogHelper.Warn(typeof(AuthSurfaceController), $"Cannot Login Facebook new member: {model.Email}");
                    return(PartialView("Profile/RegisterFacebook", model));
                }
                return(GetLoggedInMember(newMember.Name, newMember.Id, curPage.Id.ToString(), Umbraco));
            }
            catch (Exception ex)
            {
                LogHelper.Error(typeof(AuthSurfaceController), $"Error while registering Facebook member {model.Email}", ex);
                ModelState.AddModelError("FormGenericError", "Συνέβη κάποιο σοβαρό σφάλμα. Παρακαλώ προσπαθήστε ξάνα. Αλλιώς επικοινωνήστε με το support μας.");
                return(PartialView("Profile/RegisterFacebook", model));
            }
        }
        public async Task <LoginReturn> FacebookLoginHub([FromBody] FacebookLoginModel model)
        {
            LoginReturn ret = new LoginReturn();



            if (!ModelState.IsValid)
            {
                ret.errors.Add("ModelState Error");
                ret.success = false;
                //return BadRequest(ModelState);
                return(ret);
            }

            var user = await UserManager.FindByNameAsync(model.FacebookId);


            if (user == null)
            {
                RegisterFacebookModel m = new RegisterFacebookModel();
                m.FacebookAccessToken = model.FacebookAccessToken;
                var reg = await RegisterWithFacebook(m);

                if (reg.success == false)
                {
                    ret.success = false;
                    ret.errors  = reg.errors;
                    return(ret);
                }

                user = await UserManager.FindByNameAsync(model.FacebookId);

                await ChatModel.CreateSessionWithUser();

                await ChatModel.SignUpForChat(user);

                // await  ChatModel.SignUpForChat(user);
            }

            ///Must be registered by now



            ///Refresh Tokena

            if (!await UserManager.CheckPasswordAsync(user, model.FacebookAccessToken))
            {
                RegisterFacebookModel m = new RegisterFacebookModel();
                m.FacebookAccessToken = model.FacebookAccessToken;
                var reg = await ChangeFacebookAccessToken(m);

                if (reg.success == false)
                {
                    ret.success = false;
                    ret.errors  = reg.errors;
                    return(ret);
                }
            }


            return(ret);
        }
        public async Task <HttpResult> ChangeFacebookAccessToken(RegisterFacebookModel model)
        {
            HttpResult ret = new HttpResult()
            {
                errors = new List <string>(), success = true
            };

            if (!ModelState.IsValid)
            {
                ret.errors.Add("ModelState Error");
                ret.success = false;
                //return BadRequest(ModelState);
                return(ret);
            }


            FacebookClient newUserFacebookData = new FacebookClient(model.FacebookAccessToken);
            //IDictionary<string, object> result; //= (IDictionary<string, object>)e.GetResultData();
            string id = "";


            newUserFacebookData.GetCompleted +=
                (o, e) =>
            {
                if (e.Cancelled)
                {
                    // request was cancelled
                    return;
                }

                var ex = e.Error;
                if (ex != null)
                {
                    if (ex is FacebookOAuthException)
                    {
                        ret.errors.Add("FbOAuthException");
                        // oauth exception occurred
                    }
                    else if (ex is FacebookApiLimitException)
                    {
                        ret.errors.Add("FacebookApiLimitException");
                        // api limit exception occurred.
                    }
                    else if (ex is FacebookApiException)
                    {
                        ret.errors.Add("FacebookApiException");
                        // other general facebook api exception
                    }
                    else
                    {
                        // non-facebook exception such as no internet connection.
                    }

                    return;
                }


                var result = (IDictionary <string, object>)e.GetResultData();
                id = (string)result["id"];
            };


            await newUserFacebookData.GetTaskAsync("me");


            var user = await UserManager.FindByNameAsync(id);

            if (user == null)
            {
                ret.errors.Add("No user with this fb id");
                ret.success = false;
                return(ret);
            }

            IdentityResult IdentityResult = await UserManager.RemovePasswordAsync(user.Id);

            //UserManager.GenerateUserTokenAsync("Bearer", "sdfsdfsd");



            if (!IdentityResult.Succeeded)
            {
                ret.success = false;
                // return GetErrorResult(result);
                foreach (var a in IdentityResult.Errors)
                {
                    ret.errors.Add(a);
                }
            }

            IdentityResult = await UserManager.AddPasswordAsync(user.Id, model.FacebookAccessToken);

            if (!IdentityResult.Succeeded)
            {
                ret.success = false;
                // return GetErrorResult(result);
                foreach (var a in IdentityResult.Errors)
                {
                    ret.errors.Add(a);
                }
            }


            return(ret);
        }
        public async Task <HttpResult> RegisterWithFacebook(RegisterFacebookModel model)
        {
            HttpResult ret = new HttpResult();

            ret.success = true;
            ret.errors  = new List <String>();


            if (!ModelState.IsValid)
            {
                ret.errors.Add("ModelState Error");
                ret.success = false;
                //return BadRequest(ModelState);
                return(ret);
            }


            FacebookClient newUserFacebookData = new FacebookClient(model.FacebookAccessToken);
            //IDictionary<string, object> result; //= (IDictionary<string, object>)e.GetResultData();
            string id        = "";
            string firstName = "";
            string lastName  = "";


            string email = "";

            newUserFacebookData.GetCompleted +=
                (o, e) =>
            {
                if (e.Cancelled)
                {
                    // request was cancelled
                    return;
                }

                var ex = e.Error;
                if (ex != null)
                {
                    if (ex is FacebookOAuthException)
                    {
                        ret.errors.Add("FbOAuthException");
                        ret.success = false;
                        // oauth exception occurred
                    }
                    else if (ex is FacebookApiLimitException)
                    {
                        ret.errors.Add("FacebookApiLimitException");
                        ret.success = false;

                        // api limit exception occurred.
                    }
                    else if (ex is FacebookApiException)
                    {
                        ret.errors.Add("FacebookApiException");
                        ret.success = false;

                        // other general facebook api exception
                    }
                    else
                    {
                        ret.errors.Add("Something went wrong");
                        ret.success = false;
                        // non-facebook exception such as no internet connection.
                    }

                    return;
                }

                else
                {
                    var result = (IDictionary <string, object>)e.GetResultData();
                    id        = (string)result["id"];
                    firstName = (string)result["first_name"];
                    lastName  = (string)result["last_name"];
                    // link = (string)result["link"];
                    try {
                        email = (string)result["email"];
                    }
                    catch
                    {
                        email = "";
                    }
                }
            };

            if (ret.errors.Count > 0)
            {
                ret.success = false;
                return(ret);
            }

            await newUserFacebookData.GetTaskAsync("me?fields=id,name,email,first_name,last_name");

            if (ret.errors.Count > 0)
            {
                ret.success = false;
                return(ret);
            }


            System.Text.StringBuilder picLink = new System.Text.StringBuilder("https://graph.facebook.com/");
            picLink.Append(id);
            picLink.Append("/picture?type=large");



            var user = new ApplicationUser()
            {
                UserName  = id,
                Email     = email,
                NickName  = lastName,
                FirstName = firstName,
                LastName  = lastName,
                AvatarUrl = picLink.ToString()
            };

            IdentityResult IdentityResult = await UserManager.CreateAsync(user, model.FacebookAccessToken);


            if (!IdentityResult.Succeeded)
            {
                ret.success = false;
                // return GetErrorResult(result);
                foreach (var a in IdentityResult.Errors)
                {
                    ret.errors.Add(a);
                }
            }



            return(ret);
        }