private static void PreencherResposta(ItemQuestionarioParticipacao itemQuestionario,
                                              DTORelatorioQuestionarioResposta resposta,
                                              List <ItemQuestionarioParticipacaoOpcoes> todasRespostasSelecionadas,
                                              Usuario professor = null)
        {
            RespostaParticipacaoProfessor rpp;

            try
            {
                rpp = professor != null
                    ? new ManterRespostaParticipacaoProfessor().ObterTodosIQueryable()
                      .FirstOrDefault(
                    x =>
                    x.ItemQuestionarioParticipacao.ID == itemQuestionario.ID &&
                    x.Professor.ID == professor.ID)
                    : null;
            }
            catch (Exception)
            {
                rpp = null;
            }


            // Caso seja uma questão discursiva, inserir a resposta informada.
            if (itemQuestionario.TipoItemQuestionario.ID == (int)enumTipoItemQuestionario.Discursiva)
            {
                resposta.NotaTexto = rpp != null ? rpp.Resposta : itemQuestionario.Resposta;
            }
            else
            {
                var respostaSelecionada =
                    todasRespostasSelecionadas.FirstOrDefault(
                        x => x.ItemQuestionarioParticipacao.ID == itemQuestionario.ID);

                string nota;

                if (rpp != null)
                {
                    var notaProfessor =
                        new ManterRespostaParticipacaoProfessorOpcoes().ObterTodosIQueryable()
                        .FirstOrDefault(x => x.RespostaParticipacaoProfessor.ID == rpp.ID && x.RespostaSelecionada == true);

                    nota = notaProfessor?.ItemQuestionarioParticipacaoOpcoes.Nome;
                    resposta.NotaTexto   = notaProfessor?.ItemQuestionarioParticipacaoOpcoes.Nome;
                    resposta.IdProfessor = rpp.Professor.ID;
                }
                else
                {
                    nota = respostaSelecionada?.Nome;
                    resposta.NotaTexto = respostaSelecionada?.Nome;
                }

                if (nota != null)
                {
                    // Solução alternativa para obter as notas nos casos dos valores 10 e 0, que são concatenados com strings.
                    // Não existe um campo que salve o valor numérico da resposta.
                    nota =
                        nota.ToLower().Replace("10 - satisfatório", "10")
                        .Replace("0 - insatisfatório", "0");

                    int n;
                    if (int.TryParse(nota, out n))
                    {
                        resposta.Nota = n;
                    }
                    else
                    {
                        resposta.Nota = null;
                    }
                }
                else
                {
                    // Se caiu aqui é porque o questionário resposta está mal formatado.
                    resposta.Nota      = null;
                    resposta.NotaTexto = null;
                }
            }
        }
        private static DTORelatorioQuestionarioParticipacao PreencherRespostas(IReadOnlyList <DTORelatorioQuestionarioQuestao> listaQuestoes,
                                                                               List <ItemQuestionarioParticipacao> itensQuestionarioParticipacao,
                                                                               List <ItemQuestionarioParticipacaoOpcoes> todasRespostasSelecionadas,
                                                                               QuestionarioParticipacao questionarioParticipacao, List <Usuario> professores)
        {
            // Objeto DTO contendo vários dados do clone do questionário.
            var participacaoDto = ObterObjetoParticipacaoDto(questionarioParticipacao);

            // Obter nota a partir da opção selecionada, ou texto caso seja questão discursiva.
            foreach (var itemQuestionario in itensQuestionarioParticipacao)
            {
                if (itemQuestionario.InAvaliaProfessor && professores.Any())
                {
                    var questoes = listaQuestoes.Where(
                        x => x.Nome.ToLower().Trim() == itemQuestionario.Questao.ToLower().Trim());

                    foreach (var questao in questoes)
                    {
                        var resposta = new DTORelatorioQuestionarioResposta
                        {
                            Questao = questao
                        };

                        Usuario professor = null;

                        if (questao.IdProfessor != null)
                        {
                            professor = new Usuario
                            {
                                ID   = questao.IdProfessor.Value,
                                Nome = questao.NomeProfessor
                            };
                        }

                        PreencherResposta(itemQuestionario, resposta, todasRespostasSelecionadas, professor);

                        // Adicionar resposta vinculada à pergunta.
                        participacaoDto.Respostas.Add(resposta);
                    }
                }
                else
                {
                    var resposta = new DTORelatorioQuestionarioResposta
                    {
                        // Relaciona a resposta com a questão através do texto da questão.
                        // Absurdo, mas não tem outra opção de relacionar uma questão clone
                        // com a questão original. Chora, deita e rola... Muito.
                        Questao = listaQuestoes.FirstOrDefault(
                            x => x.Nome.ToLower().Trim() == itemQuestionario.Questao.ToLower().Trim())
                    };

                    // Só adiciona a resposta para uma pergunta que exista na lista informada.
                    if (resposta.Questao == null)
                    {
                        continue;
                    }

                    PreencherResposta(itemQuestionario, resposta, todasRespostasSelecionadas);

                    // Adicionar resposta vinculada à pergunta.
                    participacaoDto.Respostas.Add(resposta);
                }
            }

            return(participacaoDto);
        }