namespace CounsellorBL.BLStructure.GROUP
{
    using CounsellorBL.Common;
    using CounsellorBL.GROUP.Helper;
    using CounsellorBL.Helper;
    using MonumentDefine;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using OT.COM.ArsenalDB;
    using OT.COM.LogisticsUtil;
    using OT.COM.SignalerMessage;
    using SoldierData.EnterprizeV4;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using static CounsellorBL.GROUP.Helper.FbHelper;

    public class GroupManageService : SingleDataTableTemplate<tb_grp_group>
    {
        private class GroupViewModel
        {
            public string uid { get; set; }
            public string name { get; set; }
            public string fb_group_id { get; set; }
            public string description { get; set; }
            public int seq { get; set; }
            public string user_token { get; set; }
            public int status_flag { get; set; }
            public string announcement { get; set; }

        }
        public GroupManageService()
        {
            dgReadCommandPostDataHandler = readCommandPostDataHandler;

            dgCreateCommandGenerator = createCommandGenerator;

            dgDeleteCommandGenerator = deleteCommandGenerator;

            dgUpdateCommandGenerator = updateCommandGenerator;
        }
        [Auth(false)]
        public new CResponseMessage Read(CRequestMessage i_crmInput) => base.Read(i_crmInput);
        protected string readCommandPostDataHandler(CRequestMessage i_crmInput, ArsenalInterface i_aiArsenal, Command i_cCmd, JArray i_jaData, tb_sys_session i_sSessionUser, out object o_oReault,
             [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
             [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
             [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
        {
            string sMsg;
            Command cRes = null;
            object oResultData = null;

            try
            {
                do
                {
                    // 取得condition
                    Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput);

                    // 登入者所屬社團
                    var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);

                    /**開始組指令**/
                    QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
                    QueryJsonElement qjeGroup = lBlocks.GetInst();
                    qjeGroup.table = tb_grp_group.TABLENAME;
                    qjeGroup.displaycols = new List<string>()
                    {
                        tb_grp_group.CN_UID,
                        tb_grp_group.CN_NAME,
                        tb_grp_group.CN_FB_GROUP_ID,
                        tb_grp_group.CN_DESCRIPTION,
                        tb_grp_group.CN_SEQ,
                        tb_grp_group.CN_STATUS_FLAG,
                        tb_grp_group.CN_POST_USER_UID,
                        tb_grp_group.CN_ANNOUNCEMENT,
                        tb_grp_group.CN_CLIENT_SECRET,
                        tb_grp_group.CN_PAGE_ID,
                        tb_grp_group.CN_APP_ID,
                        tb_grp_group.CN_PAGES_TOKEN
                    };
                    List<WhereNode> wnQuery = new List<WhereNode>();
                    if (lsBranch.Any())
                    {
                        wnQuery.Add(new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_group), lsBranch.ToArray()));
                    }
                    if (wnQuery.Any())
                    {
                        qjeGroup.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, wnQuery.ToArray());
                    }
                    if (dicCondition != null && dicCondition.Any())
                    {
                        qjeGroup.dicwherecols = dicCondition;
                    }

                    lBlocks.Add(qjeGroup);

                    sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
                    ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
                    List<tb_grp_group> qds = ai.RunQueryList<tb_grp_group>(cRes);
                    sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRead);
                    if (sMsg != null)
                    {
                        break;
                    }
                    oResultData = qds.OrderBy(x => x.seq);
                }
                while (false);
            }
            catch (Exception ex)
            {
                LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
                sMsg = $"{nameof(readCommandPostDataHandler)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
                System.Diagnostics.Debug.WriteLine(sMsg);
#endif 
            }

            o_oReault = oResultData;
            return sMsg;
        }

        protected string updateCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcResult, List<string> i_saQryContainKeys,
           [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
           [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
           [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
        {
            string sMsg = null;
            List<Command> lCmds = new List<Command>();
            string uid = null;
            try
            {
                do
                {

                    List<string> data = new List<string>();

                    foreach (JToken jtk in i_jaData)
                    {
                        Dictionary<string, object> dicData = jtk.ToObject<Dictionary<string, object>>();
                        Dictionary<string, object> dicData2 = jtk[BLWording.DATA].ToObject<Dictionary<string, object>>();

                        //取得user_uid
                        if (dicData.ContainsKey(BLWording.WHEREDATA))
                        {
                            JObject wheredata = dicData[BLWording.WHEREDATA] as JObject;
                            Dictionary<string, object> wheredataDic = wheredata.ToObject<Dictionary<string, object>>();
                            if (wheredataDic.ContainsKey(BLWording.UID))
                            {
                                uid = wheredataDic[BLWording.UID].ToString();
                            }
                        }

                        var joData = dicData[BLWording.DATA] as JObject;
                        if (joData != null)
                        {
                            if (joData.ContainsKey(tb_grp_group.CN_POST_USER_UID))
                            {
                                joData[tb_grp_group.CN_POST_USER_UID] = joData[tb_grp_group.CN_POST_USER_UID].ToString().Contains("new_add") ? Guid.NewGuid().ToString() : joData[tb_grp_group.CN_POST_USER_UID].ToString();
                            }
                        }

                        tb_grp_group u = new tb_grp_group();
                        sMsg = valueAssignment(i_crmInput, u, joData, out List<Command> lcAddInsert, i_bIsCreate: false);

                        if (sMsg != null)
                        {
                            break;
                        }
                        Command c = Command.SetupUpdateCmd(u, new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), uid));
                        lCmds.Add(c);

                        bool hasUser = false;
                        if (dicData2.ContainsKey("tb_grp_group2user"))
                        {
                            var user = dicData2["tb_grp_group2user"] as JArray;
                            if (user.Any())
                            {
                                hasUser = true;
                                var updData = new List<string>();
                                foreach (var item in user)
                                {
                                    Dictionary<string, object> dicUserData = new Dictionary<string, object>();
                                    if (item.Any())
                                    {
                                        dicUserData = item.ToObject<Dictionary<string, object>>();
                                    }
                                    dicUserData.Remove(tb_grp_group2user.CN_UID);
                                    if (Guid.TryParse(item[tb_grp_group2user.CN_UID].ToString(), out var id))
                                    {
                                        updData.Add(id.ToString());
                                        // 修改
                                        tb_grp_group2user cUpdUser = new tb_grp_group2user();
                                        tb_grp_group2user cUpdCon = new tb_grp_group2user() { uid = id.ToString() };
                                        cUpdUser.FillData(dicUserData);

                                        lCmds.Add(Command.SetupUpdateCmd(cUpdUser, cUpdCon));
                                    }
                                    else
                                    {
                                        // 新增
                                        tb_grp_group2user cNewUser = new tb_grp_group2user();
                                        cNewUser.FillData(dicUserData);
                                        cNewUser.uid = Guid.NewGuid().ToString();
                                        cNewUser.create_date = DateTime.Now;// Set dirty column value
                                        cNewUser.group_uid = uid;

                                        lCmds.Add(Command.SetupInsertCmd(cNewUser));
                                    }
                                }

                                tb_grp_group2user cRecord = new tb_grp_group2user();
                                cRecord.SetFullDirty();
                                tb_grp_group2user cCon = new tb_grp_group2user() { group_uid = uid };
                                Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
                                ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
                                List<tb_grp_group2user> qds = ai.RunQueryList<tb_grp_group2user>(cSelect);

                                var delData = qds.Select(x => x.uid.ToString()).ToList().Except(updData);
                                foreach (var del in delData)
                                {
                                    tb_grp_group2user cCond = new tb_grp_group2user() { uid = del };
                                    lCmds.Add(Command.SetupDeleteCmd(cCond));
                                }
                            }
                        }

                        if (!hasUser)
                        {
                            sMsg = "至少一位發文者!";
                            break;
                        }
                    }
                }
                while (false);
            }
            catch (Exception ex)
            {
                LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
                sMsg = $"{nameof(updateCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
                System.Diagnostics.Debug.WriteLine(sMsg);
#endif 
            }

            o_lcResult = lCmds;
            return sMsg;
        }

        protected string createCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lResult, List<string> i_saQryContainKeys,
         [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
         [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
         [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
        {
            string sMsg = null;
            List<Command> lCmds = new List<Command>();
            try
            {
                do
                {
                    foreach (JToken joData in i_jaData)
                    {
                        Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
                        JObject jdata = dicData[BLWording.DATA] as JObject;
                        Dictionary<string, object> dicInput = jdata.ToObject<Dictionary<string, object>>();

                        //取得新增的帳號uid
                        string uid = Guid.NewGuid().ToString();
                        tb_grp_group cInsert = new tb_grp_group()
                        {
                            uid = uid,
                            fb_group_id = (dicInput[tb_grp_group.CN_FB_GROUP_ID] ?? "").ToString(),
                            name = dicInput[tb_grp_group.CN_NAME].ToString(),
                            app_id = dicInput[tb_grp_group.CN_APP_ID].ToString(),
                            page_id = dicInput[tb_grp_group.CN_PAGE_ID].ToString(),
                            pages_token = dicInput[tb_grp_group.CN_PAGES_TOKEN].ToString(),
                            client_secret = dicInput[tb_grp_group.CN_CLIENT_SECRET].ToString(),
                            seq = Convert.ToInt32(dicInput[tb_grp_group.CN_SEQ] ?? 0),
                            status_flag = Convert.ToInt32(dicInput[tb_grp_group.CN_STATUS_FLAG] ?? 0)
                        };
                        if (dicInput.ContainsKey(tb_grp_group.CN_DESCRIPTION) && !string.IsNullOrEmpty(dicInput[tb_grp_group.CN_DESCRIPTION]?.ToString()))
                        {
                            cInsert.description = dicInput[tb_grp_group.CN_DESCRIPTION].ToString();
                        }

                        if (dicInput.ContainsKey(tb_grp_group.CN_POST_USER_UID) && !string.IsNullOrEmpty(dicInput[tb_grp_group.CN_POST_USER_UID]?.ToString()))
                        {
                            cInsert.post_user_uid = dicInput[tb_grp_group.CN_POST_USER_UID].ToString().Contains("new_add") ? Guid.NewGuid().ToString() : dicInput[tb_grp_group.CN_POST_USER_UID].ToString();
                        }

                        Command c = Command.SetupInsertCmd(cInsert);
                        lCmds.Add(c);

                        bool hasUser = false;
                        if (dicInput.ContainsKey("tb_grp_group2user"))
                        {
                            var user = dicInput["tb_grp_group2user"] as JArray;
                            if (user.Any())
                            {
                                hasUser = true;
                                // 新增user
                                foreach (var item in user)
                                {
                                    tb_grp_group2user cNewUser = new tb_grp_group2user()
                                    {
                                        uid = cInsert.post_user_uid,
                                        group_uid = uid,
                                        fb_account = item[tb_grp_group2user.CN_FB_ACCOUNT].ToString(),
                                        fb_password = item[tb_grp_group2user.CN_FB_PASSWORD].ToString(),
                                        user_token = item[tb_grp_group2user.CN_USER_TOKEN].ToString(),
                                        status_flag = (int)item[tb_grp_group2user.CN_STATUS_FLAG],
                                    };
                                    lCmds.Add(Command.SetupInsertCmd(cNewUser));
                                }
                            }
                        }

                        if (!hasUser)
                        {
                            sMsg = "至少一位發文者!";
                            break;
                        }
                        // 新增現場銷貨會員資料
                        tb_meb_member cNewDefaultUser = new tb_meb_member()
                        {
                            uid = Guid.NewGuid().ToString(),
                            group_id = cInsert.fb_group_id,
                            group_user_id = "0000000000000000",
                            name = "現貨銷售",
                        };
                        lCmds.Add(Command.SetupInsertCmd(cNewDefaultUser));
                    }
                }
                while (false);
            }
            catch (Exception ex)
            {
                LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
                sMsg = $"{nameof(createCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
                System.Diagnostics.Debug.WriteLine(sMsg);
#endif 
            }

            o_lResult = lCmds;
            return sMsg;
        }
        protected string deleteCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lResult, List<string> i_saQryContainKeys,
         [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
         [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
         [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
        {
            string sMsg = null;
            List<Command> lCmds = new List<Command>();

            try
            {
                do
                {
                    foreach (JToken joData in i_jaData)
                    {
                        Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();

                        Dictionary<string, object> wheredataDic;
                        string uid = null;
                        if (dicData.ContainsKey(BLWording.WHEREDATA) && dicData[BLWording.WHEREDATA] is JObject wheredata)
                        {
                            wheredataDic = wheredata.ToObject<Dictionary<string, object>>();
                            if (wheredataDic.ContainsKey(BLWording.UID))
                            {
                                uid = wheredataDic[BLWording.UID].ToString();
                            }
                        }
                        tb_grp_branch ur = new tb_grp_branch()
                        {
                            group_uid = uid
                        };
                        lCmds.Add(Command.SetupDeleteCmd(ur));

                        tb_grp_group2user dUser = new tb_grp_group2user()
                        {
                            group_uid = uid
                        };
                        lCmds.Add(Command.SetupDeleteCmd(dUser));

                        tb_grp_group r = new tb_grp_group()
                        {
                            uid = uid
                        };
                        lCmds.Add(Command.SetupDeleteCmd(r));
                    }
                }
                while (false);
            }
            catch (Exception ex)
            {
                LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
                sMsg = $"{nameof(deleteCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
                System.Diagnostics.Debug.WriteLine(sMsg);
#endif 
            }

            o_lResult = lCmds;
            return sMsg;
        }
        public CResponseMessage GetAnnouncemnet(CRequestMessage i_crmInput)
        {
            string sMsg;
            CResponseMessage crmRes = null;

            try
            {
                do
                {
                    List<string> lsEmpColumns = EntityBase.GetAllColumnName(typeof(tb_grp_group));

                    // 取得condition
                    Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput);
                    QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
                    QueryJsonElement qjeGroup = lBlocks.GetInst();
                    qjeGroup.table = tb_grp_group.TABLENAME;
                    qjeGroup.displaycols = lsEmpColumns;
                    if (dicCondition.Any())
                    {
                        qjeGroup.dicwherecols = dicCondition;
                    }
                    lBlocks.Add(qjeGroup);
                    sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRead);

                    ArsenalInterface ai = ArsenalDBMgr.GetInst(cRead);
                    var qds = ai.RunQueryList<GroupViewModel>(cRead);

                    crmRes = new CSuccessResponseMessage(null, i_crmInput);
                    crmRes.param.Add(BLWording.DATA, qds);
                }
                while (false);
            }
            catch (Exception ex)
            {
                LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
                sMsg = $"{nameof(GetAnnouncemnet)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
                System.Diagnostics.Debug.WriteLine(sMsg);
#endif 
            }

            if (null != sMsg)
            {
                crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
            }
            return crmRes;
        }

        [Auth(false)]
        public CResponseMessage RefreshUserAccessToken(CRequestMessage i_crmInput)
        {
            int prepare_token_counnt = 0, success_refresh_count = 0;
            StringBuilder fbErrorString = new StringBuilder();
            List<Command> commands = new List<Command>();

            try
            {
                var groupsAndUsers = GetEnableGroupsAndGroup2Users();
                List<tb_grp_group> groups = groupsAndUsers.groups;
                List<tb_grp_group2user> group2users = groupsAndUsers.group2users;

                var FbHelp = new FbHelper();

                foreach (var group in groups)
                {
                    var AppId = group.app_id;
                    var AppSecret = group.client_secret;

                    foreach (var user in group2users.Where(x => x.group_uid == group.uid))
                    {
                        prepare_token_counnt++;
                        var UserToken = user.user_token;

                        FbHelp.GetUserAccessToken(ref UserToken, ref AppId, ref AppSecret,
                            (response) =>
                            {
                                success_refresh_count++;

                                var content = JsonConvert.DeserializeObject<FbGetTokenEntity>(response.Content.ReadAsStringAsync().Result);
                                commands.Add(Command.SetupUpdateCmd(new tb_grp_group2user() { user_token = content.access_token }, new tb_grp_group2user() { uid = user.uid }));
                            },
                            (response, error_code) =>
                            {

                                fbErrorString.AppendLine(error_code);
                            }
                        );
                    }
                }

                if (commands.Any())
                {
                    ArsenalInterface ai = ArsenalDBMgr.GetInst(commands.FirstOrDefault(), GetDefaultSystemColumnInfo());
                    ai.RunEditCmds(commands);
                }

                if (prepare_token_counnt != success_refresh_count || fbErrorString.Length > 0)
                {
                    var err = $"Prepare and success token count not same, FB response: {fbErrorString.ToString()}";
                    Logger.Error(err);
                    return new CErrorResponseMessage(err, null);
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex.ToString());
                return new CErrorResponseMessage(ex.ToString(), null);
            }

            Logger.Info($"Prepare refresh access token count={prepare_token_counnt}, success refresh count= {success_refresh_count}");
            return new CSuccessResponseMessage($"{nameof(RefreshUserAccessToken)} success", i_crmInput);
        }


        private (List<tb_grp_group> groups, List<tb_grp_group2user> group2users) GetEnableGroupsAndGroup2Users()
        {
            string sMsg = "";
            List<tb_grp_group> groups = new List<tb_grp_group>();
            List<tb_grp_group2user> group2users = new List<tb_grp_group2user>();

            QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
            QueryJsonElement qje_groups = lBlocks.GetInst();
            qje_groups.table = tb_grp_group.TABLENAME;
            qje_groups.displaycols = EntityBase.GetAllColumnName(typeof(tb_grp_group));
            qje_groups.wherecols = new WhereNode(tb_grp_group.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), BLWording.STATUS_FLAG_ON);
            lBlocks.Add(qje_groups);
            sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
            ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
            groups = ai.RunQueryList<tb_grp_group>(cRes);

            lBlocks = new QueryJsonElementCollection();
            QueryJsonElement qje_group2user = lBlocks.GetInst();
            qje_group2user.table = tb_grp_group2user.TABLENAME;
            qje_group2user.displaycols = EntityBase.GetAllColumnName(typeof(tb_grp_group2user));
            qje_group2user.wherecols = new WhereNode(tb_grp_group2user.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group2user), BLWording.STATUS_FLAG_ON);
            lBlocks.Add(qje_group2user);
            sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
            ai = ArsenalDBMgr.GetInst(cRes);
            group2users = ai.RunQueryList<tb_grp_group2user>(cRes);

            return (groups, group2users);
        }

        /// <summary>
        /// 取得群組的隱私狀態, 只有屬於這群組的人或社團管理人可以查到群組狀態
        /// </summary>
        /// <param name="i_crmInput"></param>
        /// <returns></returns>
        [Auth(false)]
        public CResponseMessage GetGroupPrivacy(CRequestMessage i_crmInput)
        {
            string sMsg;
            CResponseMessage crmRes = null;

            try
            {
                do
                {
                    Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput);
                    string group_id = dicCondition[tb_grp_group.CN_FB_GROUP_ID];

                    QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();

                    QueryJsonElement group2user = lBlocks.GetInst();
                    group2user.table = tb_grp_group2user.TABLENAME;
                    group2user.displaycols = new List<string> { tb_grp_group2user.CN_USER_TOKEN };
                    group2user.wherecols = new WhereNode(tb_grp_group2user.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group2user), BLWording.STATUS_FLAG_ON);
                    lBlocks.Add(group2user);

                    QueryJsonElement groups = lBlocks.GetInst();
                    groups.table = tb_grp_group.TABLENAME;
                    groups.displaycols = new List<string>();
                    groups.jointype = QueryJsonElement.LEFT_JOIN;
                    groups.jointable = group2user;
                    groups.joincols = new Dictionary<string, string>() { { tb_grp_group.CN_UID, tb_grp_group2user.CN_GROUP_UID } };
                    if (dicCondition.Any())
                    {
                        groups.dicwherecols = dicCondition;
                    }
                    lBlocks.Add(groups);

                    sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRead);

                    ArsenalInterface ai = ArsenalDBMgr.GetInst(cRead);
                    GroupViewModel qds = ai.RunQuerySingleORM<GroupViewModel>(cRead);

                    var FbHelp = new FbHelper();
                    FbHelp.GetGroupPublicDescription(group_id, qds.user_token,
                        (response)=>{
                            var content = JsonConvert.DeserializeObject<FbGroupEntity>(response.Content.ReadAsStringAsync().Result);

                            crmRes = new CSuccessResponseMessage(null, i_crmInput);
                            crmRes.param.Add(BLWording.DATA, content);
                        },
                        (response, error_code) =>
                        {
                            throw new Exception(error_code);
                        }
                    );
                }
                while (false);
            }
            catch (Exception ex)
            {
                LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
                sMsg = $"{nameof(GetAnnouncemnet)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
                System.Diagnostics.Debug.WriteLine(sMsg);
#endif 

                return new CErrorResponseMessage(sMsg, i_crmInput);
            }

            return crmRes;
        }
    }
}