public bool IsAprovado(Academico.Dominio.Classes.Questionario questionario, decimal?notaMinima = null)
        {
            var nota = ObterNota(questionario);

            return(nota >= (notaMinima ?? questionario.NotaMinima));
        }
        /// <summary>
        /// Obter a nota simulada do usuário no questionário informado.
        /// Compara os dados informados com os dados cadastrados.
        /// </summary>
        /// <returns></returns>
        public decimal ObterNota(Academico.Dominio.Classes.Questionario questionario)
        {
            decimal somaValorRespostasCertas  = 0;
            decimal somaValorRespostasErradas = 0;

            questionario = questionario ?? new ManterQuestionario().ObterQuestionarioPorID(Id);

            if (questionario == null)
            {
                return(0);
            }

            foreach (var itemQuestionarioDto in Questoes)
            {
                var itemQuestionario = questionario.ListaItemQuestionario.FirstOrDefault(x => x.ID == itemQuestionarioDto.Id);

                if (itemQuestionario == null)
                {
                    continue;
                }

                var valorQuestao = itemQuestionario.ValorQuestao;

                // Para provas, só interessam as questões objetivas.
                if (itemQuestionario.TipoItemQuestionario.ID == (int)enumTipoItemQuestionario.Discursiva ||
                    itemQuestionario.TipoItemQuestionario.ID == (int)enumTipoItemQuestionario.AgrupadorDeQuestoes)
                {
                    continue;
                }

                switch ((enumTipoItemQuestionario)itemQuestionario.TipoItemQuestionario.ID)
                {
                case enumTipoItemQuestionario.Objetiva:
                case enumTipoItemQuestionario.MultiplaEscolha:
                case enumTipoItemQuestionario.VerdadeiroOuFalso:
                    var respostaSelecionada =
                        itemQuestionario.ListaItemQuestionarioOpcoes.FirstOrDefault(
                            x => x.ID == itemQuestionarioDto.RespostaSelecionada);

                    if (respostaSelecionada == null)
                    {
                        continue;
                    }

                    // Se a resposta selecionada for a correta, pontua. Se não, pontua o erro.
                    if (respostaSelecionada.RespostaCorreta)
                    {
                        somaValorRespostasCertas += valorQuestao;
                    }
                    else
                    {
                        somaValorRespostasErradas += valorQuestao;
                    }

                    break;

                case enumTipoItemQuestionario.ColunasRelacionadas:
                    foreach (var opcao in itemQuestionario.ListaItemQuestionarioOpcoes.Where(x => x.OpcaoVinculada != null))
                    {
                        // Aqui que é o grande pulo do gato.
                        // Se o ID da opção vinculada for igual ao ID da opção, a resposta está correta.
                        if (itemQuestionarioDto.Opcoes.Any(o => o.Id == opcao.OpcaoVinculada.ID))
                        {
                            somaValorRespostasCertas += valorQuestao;
                        }
                        else
                        {
                            somaValorRespostasErradas += valorQuestao;
                        }
                    }

                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            var somaTotalValoresQuestoes = somaValorRespostasCertas + somaValorRespostasErradas;

            if (somaTotalValoresQuestoes == 0)
            {
                return(0);
            }

            // Assumindo que a nota máxima dos questionários seja 10,
            return((10 * somaValorRespostasCertas) / somaTotalValoresQuestoes);
        }
        public dynamic ObterGabaritoComFeedback(Academico.Dominio.Classes.Questionario questionario = null)
        {
            questionario = questionario ?? new ManterQuestionario().ObterQuestionarioPorID(Id);

            var listaRetorno = new List <dynamic>();

            foreach (var itemQuestionarioDto in Questoes)
            {
                dynamic retorno = new ExpandoObject();

                var itemQuestionario = questionario.ListaItemQuestionario.FirstOrDefault(x => x.ID == itemQuestionarioDto.Id);

                if (itemQuestionario == null)
                {
                    continue;
                }

                retorno.Questao = itemQuestionario.Questao;

                dynamic retornoQuestao = new ExpandoObject();

                var respostasSelecionadas = new List <dynamic>();
                var respostasCorretas     = new List <dynamic>();

                switch ((enumTipoItemQuestionario)itemQuestionario.TipoItemQuestionario.ID)
                {
                case enumTipoItemQuestionario.Objetiva:
                case enumTipoItemQuestionario.VerdadeiroOuFalso:
                    var respostaSelecionada =
                        itemQuestionario.ListaItemQuestionarioOpcoes.FirstOrDefault(
                            x => x.ID == itemQuestionarioDto.RespostaSelecionada);

                    if (respostaSelecionada == null)
                    {
                        continue;
                    }


                    respostasSelecionadas.Add(new
                    {
                        Texto     = respostaSelecionada.Nome,
                        IsCorreto = respostaSelecionada.RespostaCorreta
                    });

                    if (respostaSelecionada.RespostaCorreta != true)
                    {
                        var respostaCorreta = itemQuestionario.ListaItemQuestionarioOpcoes.FirstOrDefault(
                            x => x.RespostaCorreta);

                        if (respostaCorreta != null)
                        {
                            respostasCorretas.Add(respostaCorreta.Nome);
                        }
                    }

                    break;

                case enumTipoItemQuestionario.MultiplaEscolha:
                    foreach (var opcao in itemQuestionario.ListaItemQuestionarioOpcoes)
                    {
                        var opcaoDto = itemQuestionarioDto.Opcoes.FirstOrDefault(x => x.Id == opcao.ID);

                        if (opcaoDto != null)
                        {
                            respostasSelecionadas.Add(new
                            {
                                Texto     = opcao.Nome,
                                IsCorreto = opcao.RespostaCorreta
                            });
                        }
                        else
                        {
                            if (opcao.RespostaCorreta)
                            {
                                respostasCorretas.Add(opcao.Nome);
                            }
                        }
                    }

                    break;

                case enumTipoItemQuestionario.ColunasRelacionadas:
                    foreach (var opcao in itemQuestionario.ListaItemQuestionarioOpcoes.Where(x => x.OpcaoVinculada != null))
                    {
                        var opcaoDto = itemQuestionarioDto.Opcoes.FirstOrDefault(x => x.Id == opcao.ID);

                        var opcaoSelecionada =
                            opcaoDto != null?itemQuestionario.ListaItemQuestionarioOpcoes.FirstOrDefault(x => x.ID == opcaoDto.Valor) : null;

                        respostasSelecionadas.Add(new
                        {
                            Texto     = opcao.Nome,
                            IsCorreto =
                                opcaoDto != null && opcao.OpcaoVinculada != null && opcao.OpcaoVinculada.ID == opcaoDto.Id,
                            OpcaoSelecionada = opcaoSelecionada != null ? opcaoSelecionada.Nome : null,
                            RespostaCorreta  =
                                opcaoSelecionada != null && opcao.OpcaoVinculada != null && opcao.OpcaoVinculada.ID == opcaoSelecionada.ID
                                        ? opcao.OpcaoVinculada.Nome
                                        : null
                        });
                    }

                    break;

                case enumTipoItemQuestionario.Discursiva:
                case enumTipoItemQuestionario.AgrupadorDeQuestoes:
                case enumTipoItemQuestionario.Diagnostico:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                retornoQuestao.TipoQuestao           = itemQuestionario.TipoItemQuestionario.ID;
                retornoQuestao.Feedback              = itemQuestionario.ExibeFeedback == true ? itemQuestionario.Feedback : null;
                retornoQuestao.RespostasSelecionadas = respostasSelecionadas;
                retornoQuestao.RespostasCorretas     = respostasCorretas;

                retorno.Resposta = retornoQuestao;

                listaRetorno.Add(retorno);
            }

            return(listaRetorno);
        }