//[ValidateAntiForgeryToken]
        public virtual async Task <ResponseViewModel <Carro> > RegistrarCarro(Carro carro)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    using (ClientesController clientesController = new ClientesController())
                    {
                        var retornoCarro = await Cadastrar(carro);

                        var cliente = await clientesController.Detalhes(carro.IdCliente);

                        cliente.Data.TemCarro = true;
                        var retornoCliente = await clientesController.Editar(cliente.Data);

                        var response = new ResponseViewModel <Carro>
                        {
                            Data     = retornoCarro.Data,
                            Sucesso  = true,
                            Mensagem = "Entidade Cadastrada com sucesso."
                        };
                        return(response);
                    };
                }
                else
                {
                    var response = new ResponseViewModel <Carro>
                    {
                        Data     = carro,
                        Sucesso  = false,
                        Mensagem = "Erro na validação da entidade."
                    };
                    return(response);
                }
            }
            catch (Exception e)
            {
                return(new ResponseViewModel <Carro>()
                {
                    Data = null,
                    Serializado = true,
                    Sucesso = false,
                    Mensagem = "Não foi possivel atender a sua solicitação: " + e.Message
                });
            }
        }
        public async Task <ResponseViewModel <Usuario> > EditarCliente(DadosCliente editarCliente)
        {
            try
            {
                DadosGeraisCliente dados = new DadosGeraisCliente();

                Task.Run(async() =>
                {
                    DadosGeraisCliente retorno = db.Usuarios.Join(db.Clientes,
                                                                  a => a.IdPessoa,
                                                                  b => b.Id,
                                                                  (a, b) => new { a, b }).
                                                 Join(db.Enderecos,
                                                      a2 => a2.b.IdEndereco,
                                                      eP => eP.Id,
                                                      (a2, eP) => new { a2, eP }).
                                                 Select((x) => new DadosGeraisCliente
                    {
                        usuario  = x.a2.a,
                        cliente  = x.a2.b,
                        endereco = x.eP
                    }).FirstOrDefault(x => x.usuario.Login.Equals(editarCliente.Email));

                    dados = retorno;
                }).Wait();

                if (dados == null)
                {
                    throw new Exception("Data not found. please if you're a user, contact me. it's a bug or yout trying to hack me.");
                }

                UsuariosController usuariosController        = new UsuariosController();
                ClientesController estacionamentosController = new ClientesController();

                Usuario usuario = dados.usuario;
                usuario.Nome = editarCliente.Nickname;

                Endereco endereco = dados.endereco;
                endereco.Bairro      = editarCliente.Bairro;
                endereco.CEP         = editarCliente.CEP;
                endereco.IdCidade    = editarCliente.IdCidade;
                endereco.IdEstado    = editarCliente.IdEstado;
                endereco.Rua         = editarCliente.Rua;
                endereco.Numero      = editarCliente.Numero;
                endereco.Complemento = editarCliente.Complemento;

                Task.Run(async() =>
                {
                    db.Entry(dados.usuario).State  = EntityState.Detached;
                    db.Entry(dados.endereco).State = EntityState.Detached;

                    db.Entry(usuario).State  = EntityState.Modified;
                    db.Entry(endereco).State = EntityState.Modified;

                    await db.SaveChangesAsync();
                }).Wait();


                ResponseViewModel <Usuario> responseUser = new ResponseViewModel <Usuario>
                {
                    Mensagem    = "Sucessfull registered!",
                    Serializado = true,
                    Sucesso     = true,
                    Data        = usuario
                };
                return(responseUser);
            }
            catch (Exception e)
            {
                return(new ResponseViewModel <Usuario>()
                {
                    Data = null,
                    Serializado = true,
                    Sucesso = false,
                    Mensagem = "Sorry, something went wrong: " + e.Message
                });
            }
        }
        //[ValidateAntiForgeryToken]
        public virtual async Task <ResponseViewModel <Carro> > RegistrarCarro(Carro carro)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    using (ClientesController clientesController = new ClientesController())
                    {
                        var cliente = await clientesController.Detalhes(carro.IdCliente);

                        if (cliente.Data.TemCarro)
                        {
                            var carroAtual = db.Carros.FirstOrDefault(x => x.IdCliente.Equals(carro.IdCliente));
                            carroAtual.IdMarca = carro.IdMarca;
                            carroAtual.Modelo  = carro.Modelo;
                            carroAtual.Placa   = carro.Placa;
                            carroAtual.Porte   = carro.Porte;
                            var retornoCarro = await Editar(carroAtual);

                            return(new ResponseViewModel <Carro>
                            {
                                Data = null,
                                Sucesso = true,
                                Serializado = true,
                                Mensagem = "Car successfully updated."
                            });
                        }
                        else
                        {
                            cliente.Data.TemCarro = true;

                            var retornoCarro = await Cadastrar(carro);


                            var retornoCliente = await clientesController.Editar(cliente.Data);

                            return(new ResponseViewModel <Carro>
                            {
                                Data = null,
                                Sucesso = true,
                                Serializado = true,
                                Mensagem = "Car successfully registered."
                            });
                        }
                    };
                }
                else
                {
                    return(new ResponseViewModel <Carro>
                    {
                        Data = carro,
                        Sucesso = false,
                        Mensagem = "Error in entity validation."
                    });
                }
            }
            catch (Exception e)
            {
                return(new ResponseViewModel <Carro>()
                {
                    Data = null,
                    Serializado = true,
                    Sucesso = false,
                    Mensagem = "We were unable to fulfill your request: " + e.Message
                });
            }
        }