private static async Task TryEvaluateSession(ILogger log, IAssessmentCalculationService resultsService,
                                                     IFilterAssessmentCalculationService filterAssessmentCalculationService, UserSession userSession)
        {
            var state = userSession.CurrentState;

            if (state.IsComplete)
            {
                if (userSession.IsFilterAssessment)
                {
                    await filterAssessmentCalculationService.CalculateAssessment(userSession, log);
                }
                else
                {
                    await resultsService.CalculateAssessment(userSession, log);
                }
            }
            else
            {
                userSession.CurrentState.MoveToNextQuestion();
            }
        }
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "assessment/{sessionId}")] HttpRequest req,
            string sessionId,
            ILogger log,
            [Inject] IHttpRequestHelper httpRequestHelper,
            [Inject] IHttpResponseMessageHelper httpResponseMessageHelper,
            [Inject] IUserSessionRepository userSessionRepository,
            [Inject] IQuestionRepository questionRepository,
            [Inject] IAssessmentCalculationService resultsService,
            [Inject] IFilterAssessmentCalculationService filterAssessmentCalculationService)
        {
            try
            {
                var correlationId = httpRequestHelper.GetDssCorrelationId(req);
                if (string.IsNullOrEmpty(correlationId))
                {
                    log.LogInformation("Unable to locate 'DssCorrelationId' in request header");
                }

                if (!Guid.TryParse(correlationId, out var correlationGuid))
                {
                    log.LogInformation("Unable to parse 'DssCorrelationId' to a Guid");
                    correlationGuid = Guid.NewGuid();
                }

                if (string.IsNullOrEmpty(sessionId))
                {
                    log.LogInformation($"CorrelationId: {correlationGuid} - Session Id not supplied");
                    return(httpResponseMessageHelper.BadRequest());
                }

                PostAnswerRequest postAnswerRequest;
                using (var streamReader = new StreamReader(req.Body))
                {
                    var body = streamReader.ReadToEnd();
                    postAnswerRequest = JsonConvert.DeserializeObject <PostAnswerRequest>(body);
                }

                AnswerOption answerValue;
                if (Enum.TryParse(postAnswerRequest.SelectedOption, out answerValue) == false)
                {
                    log.LogInformation(
                        $"CorrelationId: {correlationGuid} - Answer supplied is invalid {postAnswerRequest.SelectedOption}");
                    return(httpResponseMessageHelper.BadRequest());
                }

                var userSession = await userSessionRepository.GetUserSession(sessionId);

                if (userSession == null)
                {
                    log.LogInformation($"CorrelationId: {correlationGuid} - Session Id does not exist {sessionId}");
                    return(httpResponseMessageHelper.NoContent());
                }

                var question = await questionRepository.GetQuestion(postAnswerRequest.QuestionId);

                if (question == null)
                {
                    log.LogInformation(
                        $"CorrelationId: {correlationGuid} - Question Id does not exist {postAnswerRequest.QuestionId}");
                    return(httpResponseMessageHelper.NoContent());
                }

                userSession.AddAnswer(answerValue, question);

                await TryEvaluateSession(log, resultsService, filterAssessmentCalculationService, userSession);

                var displayFinish = question.IsFilterQuestion
                    ? userSession.FilteredAssessmentState.IsComplete
                    : userSession.AssessmentState.IsComplete;

                if (!question.IsFilterQuestion)
                {
                    userSession.AssessmentState.CurrentQuestion = question.Order;
                }

                var result = new PostAnswerResponse()
                {
                    IsSuccess          = true,
                    IsComplete         = displayFinish,
                    IsFilterAssessment = question.IsFilterQuestion,
                    JobCategorySafeUrl = question.IsFilterQuestion ? userSession.FilteredAssessmentState.JobFamilyNameUrlSafe : null,
                    NextQuestionNumber = question.IsFilterQuestion ? userSession.FilteredAssessmentState.MoveToNextQuestion() : userSession.AssessmentState.MoveToNextQuestion()
                };

                await userSessionRepository.UpdateUserSession(userSession);

                return(httpResponseMessageHelper.Ok(JsonConvert.SerializeObject(result)));
            }
            catch (Exception ex)
            {
                log.LogError(ex, "Fatal exception {message}", ex.Message);
                return(new HttpResponseMessage {
                    StatusCode = HttpStatusCode.InternalServerError
                });
            }
        }