public TokenAtendimento Cadastrar(TokenAtendimento novoTokenAtendimento)
        {
            TokenAtendimento tokenAtendimento = new TokenAtendimento(novoTokenAtendimento.NumeroAtendimento, novoTokenAtendimento.Token);

            this.Context.Tokens.Add(tokenAtendimento);
            this.Context.SaveChanges();

            return(tokenAtendimento);
        }
        public ActionResult Cadastrar(AtendimentoViewModel viewModel)
        {
            ViewBag.NomePagina = "Finalização de Atendimento - Token";

            if (viewModel.Valido())
            {
                // Cadastro de Atendimento.
                Atendimento atendimento = Mapper.Map<AtendimentoViewModel, Atendimento>(viewModel);
                atendimento.DataAtendimento = DateTime.Now;
                atendimento.CodigoMedico = Convert.ToInt32(UserAuthentication.ObterCodigoInternoUsuarioLogado());

                atendimento = this.AtendimentoRepository.Cadastrar(atendimento);

                // Geração do Token.
                string codigoToken = Utils.GenerateRandomNumber();
                string codigoTokenBase64 = Utils.Base64Encode(codigoToken);

                TokenAtendimento token = new TokenAtendimento(atendimento.NumeroAtendimento, codigoTokenBase64);

                this.TokenAtendimentoRepository.Cadastrar(token);

                // Envio de Email para paciente com token de verificação

                PessoaFisica pessoa = this.PessoaFisicaRepository.Obter(atendimento.CodigoPessoaFisica);
                EspecialidadeAtendimento especialidade = this.EspecialidadeAtendimentoRepository.Obter(atendimento.CodigoEspecialidade);
                Medico medico = this.MedicoRepository.Obter(atendimento.CodigoMedico);

                if (pessoa == default(PessoaFisica))
                    return Json("Paciente não encontrado");

                if (especialidade == default(EspecialidadeAtendimento))
                    return Json("Especialidade não encontrado");

                if (medico  == default(Medico))
                    return Json("Médico não encontrado");

                Utils.SendEmail(pessoa.Email, $"Olá, {pessoa.Nome}, seu atendimento realidado com o(a) Dr(a). {medico.NomeGuerra} da especialidade {especialidade.DescricaoEspecialidade} realidado dia {atendimento.DataAtendimento.ToString("dd/MM/yyyy HH:mm:ss")} gerou um token de validação: {codigoToken}", $" #{atendimento.NumeroAtendimento} Atendimento Realizado");

                ViewBag.CodigoAtendimento = atendimento.NumeroAtendimento;
                ViewBag.NomePessoa = pessoa.Nome;

                return View("FinalizarCadastro");
            }

            return RedirectToAction("Index", "Atendimento");
        }
        public TokenAtendimento ConfirmarToken(int codigo)
        {
            TokenAtendimento token = this.Context.Tokens.SingleOrDefault(_ => _.CodigoTokenAtendimento == codigo);

            if (token == default(TokenAtendimento))
            {
                throw new Exception("Token não encontrado.");
            }

            token.ConfirmarToken();

            var entry = Context.Entry(token);

            entry.State = EntityState.Modified;
            this.Context.SaveChanges();

            return(token);
        }
        public ActionResult ValidarToken(TokenViewModel tokenViewModel)
        {
            if (tokenViewModel.Valido())
            {
                // Validação do Token.
                string tokenBase64 = Utils.Base64Encode(tokenViewModel.Token);
                TokenAtendimento token = this.TokenAtendimentoRepository.Obter(tokenBase64, tokenViewModel.NumeroAtendimento.Value);

                if (token == default(TokenAtendimento))
                    return Json("Token inválido.");

                if (!token.Valido())
                    return Json("Token inválido.");

                token.ConfirmarToken();
                token = this.TokenAtendimentoRepository.ConfirmarToken(token.CodigoTokenAtendimento);

                // Envia e-mail para médico informando que a consulta foi autenticada com sucesso

                Atendimento atendimento = this.AtendimentoRepository.Obter(tokenViewModel.NumeroAtendimento.Value);

                if (atendimento == default(Atendimento))
                    return Json("Atendimento não encontrado.");

                atendimento.Token = tokenBase64;
                this.AtendimentoRepository.AlterarToken(atendimento);

                Medico medico = this.MedicoRepository.Obter(atendimento.CodigoMedico);

                if (medico == default(Medico))
                    return Json("Médico não encontrado.");

                Utils.SendEmail(medico.Email, $"Olá {medico.NomeGuerra}, o atendimento #{atendimento.NumeroAtendimento} realizado às {atendimento.DataAtendimento.ToString("HH:mm tt")} do dia {atendimento.DataAtendimento.ToString("dd/MM/yyyy")} foi autenticado com sucesso.", "Atendimento autenticado por Token com sucesso!");

                return RedirectToAction("Index", "Atendimento");
            }

            return View();
        }