public static BaseSentenceModel CreateExcerciseViewModel(GetNextSentenceResult sentenceResult, UserProfile profile)
        {
            BaseSentenceModel resultModel;
            var sentence = sentenceResult.Sentence;

            // While in Excercise Controller, sentence should either be a Sample sentence or a Question sentence
            // Review sentence would be an error
            if (sentenceResult.IsReview)
            {
                Trace.TraceError("Unexpected sentence result.  Should not receive Review sentence during excericse flow.");
            }
            if (sentenceResult.IsQuestion)
            {
                bool isGrammarQ = (sentenceResult.QuestionDimension == QuestionDimension.Grammar);

                if (!isGrammarQ)
                {
                    // If it's not grammar question it's a default contextual question
                    var model = new QuestionExcerciseViewModel(sentence.SentenceText, sentence.SentenceTranslation);
                    resultModel = model;

                    // Retriev all the Question related information from the sentence
                    PopulateQuestionFields(sentenceResult, model);
                }
                else
                {
                    // Create a Grammar Question
                    var model = new GrammarQuestionExcerciseViewModel(sentence.SentenceText, sentence.SentenceTranslation);
                    resultModel = model;

                    // Retriev all the Question related information from the sentence
                    PopulateQuestionFields(sentenceResult, model);

                    //
                    // Populate Grammar Analysis related model fields
                    PopulateGrammarAnalysisFields(sentence, model.GrammarAnalysis);

                    //
                    // Populate Grammar Entries related model fields
                    PopulateGrammarEntriesFields(sentence, model.GrammarEntries);
                }
            }
            else
            {
                // It's a regular sample sentence.  Now create right model depending on whether user is
                // Contextual or Analytical

                if (LearningTypeScorePolicies.IsAnalytical(profile))
                {
                    var model = new AnalyticalExcerciseViewModel(sentence.SentenceText, sentence.SentenceTranslation);
                    resultModel = model;

                    //
                    // Populate Grammar Analysis related model fields
                    PopulateGrammarAnalysisFields(sentence, model.GrammarAnalysis);

                    //
                    // Populate Grammar Entries related model fields
                    PopulateGrammarEntriesFields(sentence, model.GrammarEntries);
                }
                else
                {
                    var model = new ContextualExcerciseViewModel(sentence.SentenceText, sentence.SentenceTranslation);
                    resultModel = model;

                    //
                    // Populate Grammar Entries related model fields
                    PopulateGrammarEntriesFields(sentence, model.GrammarEntries);
                }
            }

            return resultModel;
        }
        private static void PopulateQuestionFields(GetNextSentenceResult sentenceResult, QuestionExcerciseViewModel model)
        {
            var sentence = sentenceResult.Sentence;
            Question q;
            if (sentence.Questions.TryGetValue(sentenceResult.QuestionDimension, out q))
            {
                model.QuestionSubText = q.QuestionSubstring;
                model.BlankIndices = q.BlankPositions;
                model.CorrectAnswerChoice = q.CorrectAnswerIndex;

                foreach (var a in q.AnswerChoices)
                {
                    ViewModelAnswerChoice vmac = new ViewModelAnswerChoice();
                    vmac.Choice = a.Answer;
                    model.AnswerChoices.Add(vmac);
                }

                foreach (var seg in q.AnswerSegments)
                {
                    AnswerSegment answerSeg = new AnswerSegment();
                    answerSeg.Text = seg;
                    model.AnswerSegments.Add(answerSeg);
                }
            }
            else
            {
                // TODO: Handle internal errors like this.  Should stop the flow?
                Trace.TraceError("Failed to get retrieve Question from sentence.");
            }
        }