/// <summary>
        ///
        /// </summary>
        /// <param name="agent"></param>
        /// <param name="intentResponse"></param>
        /// <param name="response"></param>
        /// <param name="request"></param>
        /// <returns>Required field is missed</returns>
        public static void HandleParameter(AgentModel agent, IntentResponse intentResponse, RasaResponse response, AiRequest aiRequest)
        {
            if (intentResponse == null)
            {
                return;
            }

            intentResponse.Parameters.ForEach(p => {
                string query = aiRequest.Text;
                var entity   = response.Entities.FirstOrDefault(x => x.Entity == p.Name || x.Entity.Split(':').Contains(p.Name));
                if (entity != null)
                {
                    p.Value = query.Substring(entity.Start, entity.End - entity.Start);
                }

                // convert to Standard entity value

                /*if (!String.IsNullOrEmpty(p.Value) && !p.DataType.StartsWith("sys."))
                 * {
                 *  p.Value = agent.Entities
                 *      .FirstOrDefault(x => x.Entity == p.DataType)
                 *      .Entries
                 *      .FirstOrDefault((entry) =>
                 *      {
                 *          return entry.Value.ToLower() == p.Value.ToLower() ||
                 *              entry.Synonyms.Select(synonym => synonym.Synonym.ToLower()).Contains(p.Value.ToLower());
                 *      })?.Value;
                 * }*/

                // fixed entity per request

                /*if (aiRequest.Entities != null)
                 * {
                 *  var fixedEntity = request.Entities.FirstOrDefault(x => x.Name == p.Name);
                 *  if (fixedEntity != null)
                 *  {
                 *      if (query.ToLower().Contains(fixedEntity.Entries.First().Value.ToLower()))
                 *      {
                 *          p.Value = fixedEntity.Entries.First().Value;
                 *      }
                 *  }
                 * }*/
            });
        }
        public static IntentResponse HandleIntentPerContextIn(AgentModel agent, AiRequest request, RasaResponse response, Database dc)
        {
            // Merge input contexts

            /*var contexts = dc.Table<ConversationContext>()
             *  .Where(x => x.ConversationId == request.SessionId && x.Lifespan > 0)
             *  .ToList()
             *  .Select(x => new AIContext { Name = x.Context.ToLower(), Lifespan = x.Lifespan })
             *  .ToList();
             *
             * contexts.AddRange(request.Contexts.Select(x => new AIContext { Name = x.Name.ToLower(), Lifespan = x.Lifespan }));
             * contexts = contexts.OrderBy(x => x.Name).ToList();*/

            // search all potential intents which input context included in contexts

            /*var intents = agent.Intents.Where(it =>
             * {
             *  if (contexts.Count == 0)
             *  {
             *      return it.Contexts.Count() == 0;
             *  }
             *  else
             *  {
             *      return it.Contexts.Count() == 0 ||
             *          it.Contexts.Count(x => contexts.Select(ctx => ctx.Name).Contains(x.Name.ToLower())) == it.Contexts.Count;
             *  }
             * }).OrderByDescending(x => x.Contexts.Count).ToList();*/

            /*if (response.IntentRanking == null)
             * {
             *  response.IntentRanking = new List<RasaResponseIntent>
             *  {
             *      response.Intent
             *  };
             * }
             *
             * response.IntentRanking = response.IntentRanking.Where(x => x.Confidence > agent.MlConfig.MinConfidence).ToList();
             * response.IntentRanking = response.IntentRanking.Where(x => intents.Select(i => i.Name).Contains(x.Name)).ToList();*/

            // add Default Fallback Intent

            /*if (response.IntentRanking.Count == 0)
             * {
             *  var defaultFallbackIntent = agent.Intents.FirstOrDefault(x => x.Name == "Default Fallback Intent");
             *  response.IntentRanking.Add(new RasaResponseIntent
             *  {
             *      Name = defaultFallbackIntent.Name,
             *      Confidence = decimal.Parse("0.8")
             *  });
             * }*/

            response.Intent = response.IntentRanking.First();

            var intent = (dc.Table <Intent>().Where(x => x.AgentId == agent.Id && x.Name == response.Intent.Name)
                          .Include(x => x.Responses).ThenInclude(x => x.Contexts)
                          .Include(x => x.Responses).ThenInclude(x => x.Parameters).ThenInclude(x => x.Prompts)
                          .Include(x => x.Responses).ThenInclude(x => x.Messages)).First();

            var intentResponse = ArrayHelper.GetRandom(intent.Responses);

            intentResponse.IntentName = intent.Name;

            return(intentResponse);
        }