public static void AddFriendsWithoutMutualFriends(LoveHitchFacebookApp facebook, HttpContext context)
        {
            try
            {
                var mfDic = context.GetFacebookMutualFriendsDic();
                if (mfDic == null) return;
                var lstMutualFriends = (List<MutualFriendItem>)mfDic[facebook.UserId];
                if (lstMutualFriends == null) return;
                var user = FacebookHelper.LoadUserFromDbByFacebookId(facebook.UserId);

                var friendsIDsWithMutualFriends =
                    lstMutualFriends.Select(f => f.FriendID).Distinct().ToList();

                if (User.IsUsernameTaken(friendsIDsWithMutualFriends.Last().ToString()))
                {
                    FacebookHelper.AddFriends(user, 5000, context, facebook);
                }
            }
            catch (Exception ex)
            {
            }
        }
        //protected override void OnDoWork(DoWorkEventArgs e)
        public new static void DoWork(LoveHitchFacebookApp facebook, HttpContext context)
        {
            //ReportProgress(0, "Working hard on this report...");
            //var msWait = 1000 * 120;

            //while (true)
            {
                //Thread.Sleep(msWait);

                //if (this.FacebookAppList.Count == 0)
                //{
                //    Thread.Sleep(msWait);
                //}
                //else
                {
                    //var facebook = FacebookAppList[0];
                    var user = FacebookHelper.LoadUserFromDbByFacebookId(facebook.UserId);
                    if (user == null) return;

                    //for (int i = 0; i < 2; i++)
                    {
                        DateTime[] time = new DateTime[10];
                        time[0] = DateTime.Now;

                        IList<FacebookHelper.FacebookFriendData> allFriendsData =
                            FacebookHelper.GetFriendsDataList(facebook, facebook.UserId);
                        var mfDic = context.GetFacebookMutualFriendsDic();// (Dictionary<long, List<MutualFriendItem>>)context.Application["FacebookMutualFriendsDic"];
                        var allMutualFriends = (List<MutualFriendItem>)mfDic[facebook.UserId];
                        if (allMutualFriends != null)
                        {
                            for (int i = 0; i < allFriendsData.Count; i++)
                            {
                                var fbFriendData = allFriendsData[i];
                                fbFriendData.MutualFriendsCount =
                                    allMutualFriends.Count(f => f.FriendID == fbFriendData.UserId);
                            }

                            allFriendsData = allFriendsData.OrderByDescending(f => f.MutualFriendsCount).ToList();
                        }
                        var lstFriendsIds = new List<long>();
                        try
                        {
                            using (var db = new ezFixUpDataContext())
                            {
                                var tmpList =
                                    CompiledQueries.FetchActiveFriendsForUsername(db, user.Username).
                                        ToList();
                                var tmpArray =
                                    tmpList.Where(
                                        f =>
                                        f.User1.u_logincount == 0 && f.User1.u_facebookid.HasValue &&
                                        !f.User1.u_face_control_approved)
                                        .OrderBy(f => f.User1.u_name).Select(f => f.User1.u_facebookid.Value).ToArray();

                                foreach (var friendData in allFriendsData)
                                {
                                    var un = friendData.UserId;

                                    if (!tmpArray.Contains(un)) continue;

                                    int imgId = Photo.GetPrimaryOrDefaultId(un.ToString());
                                    if (imgId < 0)
                                        lstFriendsIds.Add(un);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                        }
                        if (lstFriendsIds.Count > 0)
                        {
                            try
                            {
                                var parameterizedThreadsList =
                                    new LoveHitchParallel.ParameterizedThreadsList<long>(
                                        lstFriendsIds,
                                        (new FacebookHelper.FetchAndSaveSaveFacebookFriendImageClass()).
                                            FetchAndSaveFacebookImageByFacebookId,
                                        null);
                                parameterizedThreadsList.RunAsBackgroundThreads = true;
                                parameterizedThreadsList.ExecuteParallelWork(1);
                            }
                            catch (Exception ex)
                            {
                            }
                        }
                    }
                    //FacebookAppList.RemoveAt(0);
                }
            }
        }
        private static void FetchAndSaveFacebookMutualFriends(LoveHitchFacebookApp facebook, HttpContext context)
        {
            DateTime[] time = new DateTime[5];
            time[0] = DateTime.Now;

            var user = FacebookHelper.LoadUserFromDbByFacebookId(facebook.UserId);
            var dic = context.GetFacebookFriendsDic();
            if (user == null || dic == null) return;

            var sessionFriendsData = (dic.ContainsKey(facebook.UserId)) ? dic[facebook.UserId] : null;
            if (sessionFriendsData == null) return;

            var mfDic = context.GetFacebookMutualFriendsDic();
            if (mfDic == null || mfDic[facebook.UserId] == null) return;

            var lstMutualFriends = (List<MutualFriendItem>)mfDic[facebook.UserId];
            if (lstMutualFriends == null) return;

            var totalFriendsCount = sessionFriendsData.Count;
            int limit = 40;
            var lstFriendsMutualCount = new List<MutualFriendItem>();

            for (int offset = 0; offset < totalFriendsCount; offset += limit)
            {
                var qry1 = "SELECT uid2 FROM friend WHERE uid1=me()";
                var qry2tmpl =
                    "select uid, mutual_friend_count from user where mutual_friend_count > 00 and mutual_friend_count <= 30 and uid in " +
                    "( SELECT uid2 FROM friend WHERE uid1=me() limit {0} offset {1})";
                var qry2 = String.Format(qry2tmpl, limit, offset);

                JsonArray res = FacebookHelper.GetFqlResult(facebook, qry2);
                lstFriendsMutualCount =
                    lstFriendsMutualCount.Union(
                                          res.Select(o => new MutualFriendItem
                                          {
                                              FriendID = long.Parse((string)((JsonObject)o)["uid"]),
                                              MutualFriendID = ((JsonObject)o)["mutual_friend_count"] == null ? 0 : long.Parse((string)((JsonObject)o)["mutual_friend_count"])
                                          })).ToList();
            }
            //var groups = lstFriendsMutualCount.GroupBy(o => o.FriendID);
            //int groupsCount = groups.Count();
            //long x = lstFriendsMutualCount.Sum(o => o.MutualFriendID);

            time[1] = DateTime.Now;

            var lstFacebookSessionMutualFriends = new List<MutualFriendItem>();
            //long counter = 0;
            const long limitCount = 20;
            //long skipCount = 0;
            int qryCount = 0;
            for (long i = 0; i < totalFriendsCount; i += limitCount)
            {
                //if (counter + lstFriendsMutualCount[i].MutualFriendID < 400 && limitCount < 80)
                //if (counter + lstFriendsMutualCount[i].MutualFriendID < 300 && limitCount < 30)
                //{
                //    limitCount++;
                //    counter += lstFriendsMutualCount[i].MutualFriendID;
                //}
                //else
                {
                    qryCount++;
                    //counter = lstFriendsMutualCount[i].MutualFriendID;
                    var qry1tmpl =
                        "select uid from user where mutual_friend_count > 30 and mutual_friend_count <= 200 and uid in (SELECT uid2 FROM friend WHERE uid1=me()  limit {0} offset {1}) ";
                    var qry1 = String.Format(qry1tmpl, limitCount, i);
                    //for (long j = 0; j < totalFriendsCount; j += 1260)
                    {
                        //var qry2tmpl = "SELECT uid2 FROM friend WHERE uid1=me() limit 1260 offset {0}";
                        //var qry2 = String.Format(qry2tmpl, j);
                        var qry2 = "SELECT uid2 FROM friend WHERE uid1=me()";
                        //limitCount = 1;
                        //skipCount = i-1;
                        var qry3tmpl = "select uid1,uid2 from friend where uid1 in ({0}) and uid2 in ({1})";
                        var qry3 = String.Format(qry3tmpl, qry1, qry2);
                        JsonArray res = FacebookHelper.GetFqlResult(facebook, qry3);
                        var res1 = res.Select(o => new MutualFriendItem
                        {
                            FriendID = long.Parse((string)((JsonObject)o)["uid1"]),
                            MutualFriendID =
                                long.Parse((string)((JsonObject)o)["uid2"])
                        });
                        var res2 = res1.Select(o => new MutualFriendItem
                        {
                            FriendID = o.MutualFriendID,
                            MutualFriendID = o.FriendID
                        });
                        lstFacebookSessionMutualFriends = lstFacebookSessionMutualFriends.Union(res1).Union(res2).ToList();
                    }
                }
            }
            time[2] = DateTime.Now;
            //time[2] = DateTime.Now;

            //var qryFriendsCountMF =
            //    //"SELECT uid FROM user ORDER BY mutual_friend_count DESC limit 5000";
            //    //"SELECT uid,mutual_friend_count FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me()) order by mutual_friend_count DESC limit 5000";
            //        "SELECT uid2 FROM friend WHERE uid1=me()";

            //JsonArray friendsByQuery = facebook.GetFqlResult(qryFriendsCountMF);

            //var lstFriends = friendsByQuery
            //        .Select(o => new
            //        {
            //            FriendID = long.Parse((string)((JsonObject)o)["uid2"])
            //            //,MutualFriendsCount = long.Parse((string) ((JsonObject) o)["mutual_friend_count"])
            //        }).ToList();

            //var qryMutualFriendsTemplate = "SELECT uid1, uid2 FROM friend " +
            //                               " WHERE uid1 IN (SELECT uid2 FROM friend WHERE uid1=me() limit {0} offset {1}) " +
            //                               " AND   uid2 IN (SELECT uid2 FROM friend WHERE uid1=me())";

            //var mutualFriendItems = new List<MutualFriendItem>();
            //int limit = 60;
            //for (int offset = 0; offset < lstFriends.Count; offset += limit)
            //{
            //    JsonArray mutualFriendsPerFriendByQuery =
            //        facebook.GetFqlResult(String.Format(qryMutualFriendsTemplate, limit, offset));

            //    mutualFriendItems = mutualFriendItems.Union(
            //        mutualFriendsPerFriendByQuery.Select(o => new MutualFriendItem
            //        {
            //            FriendID = long.Parse((string)((JsonObject)o)["uid1"]),
            //            MutualFriendID = long.Parse((string)((JsonObject)o)["uid2"])
            //        })
            //                                            ).ToList();
            //}
            //var mfDic = context.GetFacebookMutualFriendsDic();
            //if (mfDic == null) return;
            //var lstMutualFriends = (List<MutualFriendItem>)mfDic[facebook.UserId];
            //if (lstMutualFriends == null) return;

            lstMutualFriends = lstMutualFriends.Union(lstFacebookSessionMutualFriends).ToList();
            var quickSessionMutualFriendsList = new List<MutualFriendItem>();

            //var user = FacebookHelper.LoadUserFromDbByFacebookId(facebook.UserId);
            var mfGroups = lstMutualFriends.GroupBy(f => f.FriendID);
            foreach (var mfGroup in mfGroups)
            {
                var friendUsername = mfGroup.Key.ToString();
                if (user.IsUserInFriendList(friendUsername))
                {
                    string mfData = string.Join(",", mfGroup.Select(g => g.MutualFriendID.ToString()).ToArray());
                    using (SqlConnection conn = Config.DB.Open())
                    {
                        object scalar =
                            SqlHelper.GetDB().ExecuteScalar("UpdateFacebookMutualFriends",
                                                    user.Username, friendUsername, mfData);
                    }
                    quickSessionMutualFriendsList.AddRange(mfGroup.Take(5));
                }
            }
            time[3] = DateTime.Now;
            time[3] = DateTime.Now;
            mfDic[facebook.UserId] = quickSessionMutualFriendsList;
        }