public async Task <ControleVeiculo> AlterarAsync(ControleVeiculo controleVeiculo)
        {
            _estacionamentoContext.ControleVeiculo.Update(controleVeiculo);
            await _estacionamentoContext.SaveChangesAsync();

            return(controleVeiculo);
        }
        public async Task <bool> ControleVeiculoAsync(ControleVeiculo controleVeiculo)
        {
            Veiculo retornoVeiculo = await _veiculoRepository.BuscarPorIdAsync(controleVeiculo.VeiculoId);

            if (retornoVeiculo == null)
            {
                _notificador.Add("Veiculo", "Não existe o Veiculo com esse ID");
                return(false);
            }

            Estabelecimento retornoEstabelecimento = await _estabelecimentoRepository.BuscarPorIdAsync(controleVeiculo.EstabelecimentoId);

            if (retornoEstabelecimento == null)
            {
                _notificador.Add("Veiculo", "Não existe estabelecimento com esse ID");
                return(false);
            }


            if (controleVeiculo.TipoControle == (int)ETipoControle.Entrada)
            {
                return(await EntradaVeiculoAsync(controleVeiculo, retornoEstabelecimento));
            }
            else
            {
                return(await SaidaVeiculoAsync(controleVeiculo, retornoEstabelecimento));
            }
        }
        public async Task <bool> SaidaVeiculoAsync(ControleVeiculo controleVeiculo, Estabelecimento estabelecimento)
        {
            var controle = await _controleVeiculoRepository.VerificarVeiculoEstaDentroEstabelecimento(controleVeiculo);

            if (controle == null)
            {
                _notificador.Add("ControleVeiculo", "O veiculo não está dentro do estabalecimento informado.");
                return(false);
            }

            controle.DataHoraSaida = DateTime.Now;
            var controlAlterado = await _controleVeiculoRepository.AlterarAsync(controle);

            return(true);
        }
        public async Task <bool> EntradaVeiculoAsync(ControleVeiculo controleVeiculo, Estabelecimento estabelecimento)
        {
            if (controleVeiculo.Tipo == (int)ETipo.Automovel)
            {
                int qtd = await _controleVeiculoRepository.QuantidadeAutmovelDentroEstabelecimento(controleVeiculo);

                if (qtd > estabelecimento.QtdVagasCarros)
                {
                    _notificador.Add("ControleVeiculo", "O estabelecimento está lotado para vaga de automoveis.");
                    return(false);
                }
            }
            else
            {
                int qtd = await _controleVeiculoRepository.QuantidadeMotoDentroEstabelecimento(controleVeiculo);

                if (qtd > estabelecimento.QtdVagasMotos)
                {
                    _notificador.Add("ControleVeiculo", "O estabelecimento está lotado para vaga de motos.");
                    return(false);
                }
            }

            var controle = await _controleVeiculoRepository.VerificarVeiculoEstaDentroEstabelecimento(controleVeiculo);

            if (controle != null)
            {
                _notificador.Add("ControleVeiculo", "O veiculo já está dentro do estacionamento.");
                return(false);
            }

            controleVeiculo.Id = Guid.NewGuid();
            controleVeiculo.DataHoraEntrada = DateTime.Now;
            controleVeiculo.DataHoraSaida   = null;
            await _controleVeiculoRepository.AdicionarAsync(controleVeiculo);

            return(true);
        }
        public async Task <int> QuantidadeMotoDentroEstabelecimento(ControleVeiculo controleVeiculo)
        {
            int qtd = await _estacionamentoContext.ControleVeiculo.Where(c => c.EstabelecimentoId == controleVeiculo.EstabelecimentoId && c.TipoControle == 1 && c.Tipo == 2).CountAsync();

            return(qtd);
        }
        public async Task <ControleVeiculo> VerificarVeiculoEstaDentroEstabelecimento(ControleVeiculo controleVeiculo)
        {
            var controle = await _estacionamentoContext.ControleVeiculo.Include(e => e.estabelecimento).Include(v => v.Veiculo).Where(c => c.EstabelecimentoId == controleVeiculo.EstabelecimentoId && c.VeiculoId == controleVeiculo.VeiculoId && c.DataHoraSaida == null).FirstOrDefaultAsync();

            return(controle);
        }