private static void AssignParameterData(IntentDefinition.IntentParam param, CalOneBotData chatdata)
        {
            if (param.ParamName == WitContants.entity_location && chatdata.Entities.Location != null)
            {
                param.Value = FindBestEntity(chatdata.Entities.Location.ToList()).Value;
            }

            if (param.ParamName == WitContants.entity_subjects && chatdata.Entities.EntitySubjects != null)
            {
                param.Value = FindBestEntity(chatdata.Entities.EntitySubjects.ToList()).Value;
            }

            if (param.ParamName == WitContants.entity_grade && chatdata.Entities.EntityGrades != null)
            {
                param.Value = FindBestEntity(chatdata.Entities.EntityGrades.ToList()).Value;
            }
        }
        public static string ProcessChatBotMessage(CalOneBotData chatdata)
        {
            if (chatdata == null)
            {
                return(null);
            }

            var    reply_builder    = new StringBuilder();
            string intent_subject   = chatdata.Entities.Intent_Subject != null ? chatdata.Entities.Intent_Subject[0].Value : "";
            string intent_direction = chatdata.Entities.Intent_Direction != null ? chatdata.Entities.Intent_Direction[0].Value : "";
            string default_answer   = chatdata.Entities.DefaultAnswers != null ? chatdata.Entities.DefaultAnswers[0].Value : "";

            // IF SUBJECT AND NOT SURE INTENT!
            if (!string.IsNullOrEmpty(intent_subject) && string.IsNullOrEmpty(intent_direction))
            {
                // SUBJECT IS KNOW BUT DONT KNOW INTENT, ASSUME ASKING
                intent_direction = WitContantAction.intent_action_querytask;
            }

            if (!string.IsNullOrEmpty(intent_subject) && !string.IsNullOrEmpty(intent_direction))
            {
                string targetIntent = intent_subject + intent_direction;

                m_currentIntent         = null;
                m_currentIntentQuestion = null;

                var ff = m_DefinitionList.Where(
                    m => m.Intent == targetIntent
                    ).Select(m => m).ToList();

                m_currentIntentQuestion = null;

                if (ff.Count > 0)
                {
                    m_currentIntent = ff[0];
                }

                if (m_currentIntent != null)
                {
                    //INITIALIZE INTENT PARAMS
                    var paramList = m_currentIntent.IntentParameters.Where(m => m.IsRequired).ToList();
                    paramList.ForEach(m => {
                        m.Value = "";
                        AssignParameterData(m, chatdata);
                    });

                    reply_builder.Append(ReplyManager.Reply(m_currentIntent.Intent_Salutation));

                    var findRequiredField = m_currentIntent.IntentParameters.Where(m => m.IsRequired && string.IsNullOrEmpty(m.Value)).ToList();
                    if (findRequiredField.Count >= 2)
                    {
                        reply_builder.Append(ReplyManager.Reply(WitContants.salutation_askfewquestions));
                    }
                }
            }

            if (m_segway != null)
            {
                if (default_answer == "default_yes")
                {
                    m_currentIntent = m_segway;
                }

                if (m_currentIntent == null)
                {
                    reply_builder.Append("No problem.  Can I assist you in any other way?");
                }

                m_segway = null;
            }

            if (m_currentIntentQuestion != null)
            {
                m_currentIntentQuestion.Value = chatdata.Text; // IF NO ENTITY DETECTED AND HAS A DEFAULT QUESTION, ASSIGN IT TO THE QUESTION

                //Append any remarks after an answer
                reply_builder.Append(ReplyManager.Reply(m_currentIntentQuestion.AfterAnswer));

                m_currentIntentQuestion = null;
            }

            if (chatdata.Entities.Farewell != null)
            {
                reply_builder.Append(ReplyManager.Reply(WitContants.entity_bye));
            }

            if (m_currentIntent != null)
            {
                var  findRequiredField = m_currentIntent.IntentParameters.Where(m => m.IsRequired && string.IsNullOrEmpty(m.Value)).ToList();
                bool IsIntentSatisfied = findRequiredField.Count == 0;

                if (IsIntentSatisfied)
                {
                    string intent_value = "";
                    if (m_currentIntent.Intent == WitContantsIntent.intent_subject_payment + WitContantAction.intent_action_querytask)
                    {
                        intent_value = CalOneBotAnswer.GetTutionPayment(m_currentIntent.IntentParameters);
                    }

                    if (m_currentIntent.Intent == WitContantsIntent.intent_subject_complaint + WitContantAction.intent_action_dotask)
                    {
                        intent_value = "I have heard you and we will get back at you as soon as possible.";
                    }

                    if (m_currentIntent.Intent == WitContantsIntent.intent_subject_registration + WitContantAction.intent_action_dotask)
                    {
                        intent_value = "Thank you.  Your registration has been filed.";
                    }

                    if (m_currentIntent.Intent == WitContantsIntent.intent_subject_courses + WitContantAction.intent_action_querytask)
                    {
                        intent_value = "Math, Mandarin, Science.";

                        var seg1 = m_DefinitionList.Find(m => m.Intent == WitContantsIntent.intent_subject_registration + WitContantAction.intent_action_dotask);
                        m_SegwayList.Enqueue(seg1);
                    }

                    if (string.IsNullOrEmpty(intent_value))
                    {
                        intent_value = WitContants.no_answer_response;
                    }

                    reply_builder.Append(intent_value);

                    if (m_SegwayList.Count > 0)
                    {
                        m_segway = m_SegwayList.Dequeue();
                        reply_builder.Append("\n" + m_segway.Intent_AskToDo);
                    }

                    m_currentIntent = null;
                    return(reply_builder.ToString());
                }

                if (findRequiredField.Count > 0)
                {
                    m_currentIntentQuestion       = findRequiredField[0];
                    m_currentIntentQuestion.Value = "";

                    reply_builder.Append(m_currentIntentQuestion.QuestionIfMissing);
                }
                else
                {
                    reply_builder.Append("Processing.");
                }
            }
            return(reply_builder.ToString());
        }