private Intention GetNextIntention()
    {
        if (SelectedStrategy == null)
        {
            return(null);
        }

        var intentions = SelectedStrategy.GetIntentions();

        if (_selectIntentIndex >= intentions.Count)
        {
            SelectedStrategy = null;
            return(null);
        }

        var intention = intentions.ElementAt(_selectIntentIndex);

        ++_selectIntentIndex;
        if (_selectIntentIndex >= intentions.Count)
        {
            SelectedStrategy = null;
        }

        return(intention);
    }
    public Intention SelectIntention(History history, ICollection <IEmpathicStrategy> strategies, User user)
    {
        if (SelectedStrategy != null)
        {
            return(GetNextIntention());
        }

        if (!_shownIntro)
        {
            SelectedStrategy = GetStrategyByName(strategies, "welcome");
            _shownIntro      = true;
        }
        else
        {
            // IF emotivector woke then choose strategy
            var expectancy = history.Get <Emotivector.Expectancy>("Expectancy");
            if (expectancy != null)
            {
                string name    = expectancy.Owner.Name.ToLower(),
                       valence = expectancy.valence.ToString().ToLower(),
                       change;
                switch (expectancy.change)
                {
                case Emotivector.Expectancy.Change.BetterThanExpected:
                    change = "greater";
                    break;

                case Emotivector.Expectancy.Change.WorseThanExpected:
                    change = "lesser";
                    break;

                case Emotivector.Expectancy.Change.AsExpected:
                // Waterfall
                default:
                    change = "as-expected";
                    break;
                }

                SelectedStrategy = GetStrategyByName(strategies,
                                                     name + "-" + valence + "-" + change);
                history.Set("Expectancy", null);
            }
            else
            {
                // ELSE choose interaction strategy
                if (_shownStrategies >= NumStrategiesPerDay)
                {
                    SelectedStrategy = GetStrategyByName(strategies, "exit");
                }
                else
                {
                    List <IEmpathicStrategy> introStrategies = GetStrategiesContainsName(strategies, "intro");
                    // Randomize List
                    introStrategies = introStrategies.OrderBy(a => Guid.NewGuid()).ToList();
                    foreach (var introStrategy in introStrategies)
                    {
                        if (introStrategy.IsValid() && !PlayedStrategies.Contains(introStrategy.Name))
                        {
                            PlayedStrategies.Add(introStrategy.Name);
                            ++ShownStrategies;
                            SelectedStrategy = introStrategy;
                            break;
                        }
                    }
                }
            }
        }

        return(GetNextIntention());
    }