public void ExcluirInternacao(Internacao internacao)
        {
            if (internacao == null)
            {
                throw new ArgumentNullException(nameof(internacao));
            }

            try
            {
                this._context.Internacoes.Remove(internacao);
                this._context.SaveChanges();
            }
            catch (RetryLimitExceededException ex)
            {
                this._logger.Error(ex.StackTrace);
                throw;
            }
        }
        public void AtualizarInternacao(Internacao internacao)
        {
            if (internacao == null)
            {
                throw new ArgumentNullException(nameof(internacao));
            }

            try
            {
                this._context.Entry(internacao).State = EntityState.Modified;
                this._context.SaveChanges();
            }
            catch (RetryLimitExceededException ex)
            {
                this._logger.Error(ex.StackTrace);
                throw;
            }
        }
        public int CriarInternacao(Internacao internacao)
        {
            if (internacao == null)
            {
                throw new ArgumentNullException(nameof(internacao));
            }

            try
            {
                this._context.Internacoes.Add(internacao);
                this._context.SaveChanges();
            }
            catch (RetryLimitExceededException ex)
            {
                this._logger.Error(ex.StackTrace);
                throw;
            }

            return internacao.Id;
        }
        public ActionResult Criar([Bind(Exclude = "Id")] InternacaoViewModel viewModel)
        {
            if (!this.ModelState.IsValid)
            {
                return this.View(viewModel);
            }

            Paciente paciente;
            using (var servico = DependencyResolver.Current.GetService<IPacienteService>())
            {
                paciente = servico.GetPaciente(viewModel.NomePaciente);
            }

            if (paciente == null)
            {
                this.ViewBag.Erros = new List<string>();
                this.ViewBag.Erros.Add(StringResources.PacienteNaoEncontrado);

                return this.View(viewModel);
            }

            var internado = paciente.Internacoes.Any(i => i.DataSaida == null);
            if (internado)
            {
                this.ViewBag.Erros = new List<string>();
                this.ViewBag.Erros.Add(StringResources.MensagemJaInternado);

                return this.View(viewModel);
            }

            // Busca leito disponível
            var leito = this._servicoLeito.GetLeitoLivre(viewModel.SetorLeito);
            if (leito == null)
            {
                this.ViewBag.Erros = new List<string>();
                this.ViewBag.Erros.Add(StringResources.MensagemSemLeitos);

                return this.View(viewModel);
            }

            var internacao = new Internacao
            {
                PacienteId = paciente.Id,
                DataInternacao = DateTimeOffset.UtcNow,
                LeitoId = leito.Id
            };

            this._servico.CriarInternacao(internacao);
            this.LogAcao(internacao.Id);

            // Atualiza leito
            leito.Ocupado = true;
            this._servicoLeito.AtualizarLeito(leito);
            this.LogAcao(leito.Id);

            return this.RedirectToAction("Index");
        }