/*---------------------------------------------------VIAGEM---------------------------------------------------------------------------*/
        //Gerar viagem
        public Viagem GerarViagem(List <Veiculo> veiculos, List <Percurso> percursos)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("\n===== Viajar =====\n");
            Console.ResetColor();

            //escolher o percurso para a viagem
            MostrarPercursos(percursos);
            Console.WriteLine("Escolha um percurso? \n Insira o numero: ");
            uint opcaoPercurso;

            while (!uint.TryParse(Console.ReadLine(), out opcaoPercurso))
            {
                Console.WriteLine($"Invalido! Escolha um percurso? \n Insira o numero: ");
            }

            //escolher o veiculo para a viagem
            MostarVeiculo(veiculos, false);
            Console.WriteLine("Escolha um veiculo? \n Insira o numero: ");
            uint opcaoVeiculo;

            while (!uint.TryParse(Console.ReadLine(), out opcaoVeiculo))
            {
                Console.WriteLine("Invalido! Escolha um veiculo? \n Insira o numero: ");
            }


            Veiculo  veiculo  = veiculos.Find(buscaVeiculo => buscaVeiculo.IdVeiculo == opcaoVeiculo);
            Percurso percurso = percursos.Find(buscaPercurso => buscaPercurso.IdPercurso == opcaoPercurso);

            double distancia = percurso.KM;
            double kmPercorrido;
            double kmLitroAlcool = veiculo.KmLitroAlcool;
            double kmLitroGas    = veiculo.KmLitroGas;

            //calculos de desconto de autonomia

            // se o veiculo for flex
            if (veiculo.Flex == true)
            {
                // verifica se a autonomia é suficiente para percorrer a viagem. se não for
                if (distancia > (veiculo.QuantidadeAtualAlcool * veiculo.KmLitroAlcool + veiculo.QuantidadeAtualGas * veiculo.KmLitroGas))
                {
                    if (veiculo.QuantidadeAtualAlcool == 0)
                    {
                        kmPercorrido = (distancia / veiculo.KmLitroGas);
                        veiculo.QuantidadeAtualGas -= kmPercorrido;
                    }
                    kmPercorrido = (distancia / veiculo.KmLitroAlcool);
                    veiculo.QuantidadeAtualAlcool -= kmPercorrido;


                    Console.WriteLine($"Você percorreu {kmPercorrido:F2} km.");

                    if (veiculo.QuantidadeAtualAlcool + veiculo.QuantidadeAtualGas == 0) // se acabar o combustivel
                    {
                        while (distancia > 0)
                        {
                            Console.WriteLine("A quantidade atual de combustivel, não percorre a distancia solicitada. Deseja abastecer o veiculo? (S ou N)");
                            string opcaoAbastecer = Console.ReadLine().ToUpper().Trim();
                            while (opcaoAbastecer != "S" && opcaoAbastecer != "N")
                            {
                                Console.WriteLine("Invalido! Deseja abastecer o veiculo? (S ou N) ");
                                opcaoAbastecer = Console.ReadLine().ToUpper().Trim();
                            }

                            if (opcaoAbastecer == "S") // se quiser abastecer
                            {
                                Abastecer(veiculos);
                            }


                            else // se não quiser
                            {
                                Console.WriteLine("Você optou por não abastecer");
                                return(new Viagem {
                                    VeiculoViagem = veiculo, PercursoViagem = percurso, StatusViagem = $"Viagem Pausada, distancia restante{distancia}"
                                });;
                            }

                            distancia -= kmPercorrido;

                            if (veiculo.QuantidadeAtualAlcool == 0)
                            {
                                veiculo.QuantidadeAtualAlcool -= kmPercorrido / veiculo.KmLitroAlcool;
                            }
                            else
                            {
                                veiculo.QuantidadeAtualGas -= kmPercorrido / veiculo.KmLitroGas;
                            }
                        }
                    }
                }
                //se a quantidade de combustivel for suficiente
                else
                {
                    if (veiculo.QuantidadeAtualAlcool == 0)
                    {
                        kmPercorrido = (distancia / veiculo.KmLitroGas);
                        veiculo.QuantidadeAtualGas -= kmPercorrido;
                    }
                    kmPercorrido = (distancia / veiculo.KmLitroAlcool);
                    veiculo.QuantidadeAtualAlcool -= kmPercorrido;
                }

                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("\nVocê concluiu o percurso total\n");
                Console.ResetColor();
            }
            else // se o veiculo não for flex
            {
                if (veiculo.TipoCombustivel == "A") // se o veiculo for a alcool
                {
                    while (distancia > 0)
                    {
                        if (veiculo.KmLitroAlcool * veiculo.QuantidadeAtualAlcool < distancia)
                        {
                            double quantidadePercorridaKM     = veiculo.QuantidadeAtualAlcool * kmLitroAlcool;
                            double quantidadePercorridaLitros = quantidadePercorridaKM / kmLitroAlcool;
                            veiculo.QuantidadeAtualAlcool -= quantidadePercorridaLitros;
                            distancia -= quantidadePercorridaKM;


                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("\n Não é possivel percorrer a distancia total.");
                            Console.WriteLine($"\n A distancia percorrida foi de {quantidadePercorridaKM:F2}KM. Ainda restam {distancia:F2}KM \n");
                            Console.ResetColor();
                            Console.WriteLine(" Deseja abastecer? (S ou N) ");
                            string opcaoAbastecer = Console.ReadLine().ToUpper().Trim();
                            while (opcaoAbastecer != "S" && opcaoAbastecer != "N")
                            {
                                Console.WriteLine("Invalido! Deseja abastecer o veiculo? (S ou N) ");
                                opcaoAbastecer = Console.ReadLine().ToUpper().Trim();
                            }

                            if (opcaoAbastecer == "S")
                            {
                                Abastecer(veiculos);
                            }


                            else
                            {
                                Console.WriteLine("Você optou por não abastecer! A corrida foi cancelada");
                                return(new Viagem {
                                    VeiculoViagem = veiculo, PercursoViagem = percurso, StatusViagem = $"Viagem Pausada, distancia restante{distancia}"
                                });
                            }
                        }

                        else // caso tem combustivel suficiente para fazer a corrida
                        {
                            double litrosNecessarios      = distancia / kmLitroAlcool;
                            double quantidadePercorridaKM = litrosNecessarios * kmLitroAlcool;
                            distancia -= quantidadePercorridaKM;
                            veiculo.QuantidadeAtualAlcool -= (quantidadePercorridaKM / kmLitroAlcool);
                        }
                    }

                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("\nVocê concluiu o percurso total\n");
                    Console.ResetColor();
                }

                else //  se o carro for a gasolina
                {
                    while (distancia > 0)
                    {
                        if (veiculo.KmLitroGas * veiculo.QuantidadeAtualGas < distancia)
                        {
                            double quantidadePercorridaKM     = veiculo.QuantidadeAtualGas * kmLitroGas;
                            double quantidadePercorridaLitros = quantidadePercorridaKM / kmLitroGas;
                            veiculo.QuantidadeAtualGas -= quantidadePercorridaLitros;
                            distancia -= quantidadePercorridaKM;

                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("\n Não é possivel percorrer a distancia total.");
                            Console.WriteLine($"\n A distancia percorrida foi de {quantidadePercorridaKM:F2}KM. Ainda restam {distancia:F2}KM \n");
                            Console.ResetColor();
                            Console.WriteLine(" Deseja abastecer? (S ou N) ");
                            string opcaoAbastecer = Console.ReadLine().ToUpper().Trim();
                            while (opcaoAbastecer != "S" && opcaoAbastecer != "N")
                            {
                                Console.WriteLine("Invalido! Deseja abastecer o veiculo? (S ou N) ");
                                opcaoAbastecer = Console.ReadLine().ToUpper().Trim();
                            }

                            if (opcaoAbastecer == "S")
                            {
                                Abastecer(veiculos);
                            }

                            else
                            {
                                Console.WriteLine("Você optou por não abastecer! A corrida foi cancelada");
                                return(new Viagem {
                                    VeiculoViagem = veiculo, PercursoViagem = percurso, StatusViagem = $"Viagem Pausada, distancia restante{distancia}"
                                });
                            }
                        }

                        else // caso tem combustivel suficiente para fazer a corrida
                        {
                            double litrosNecessarios      = distancia / kmLitroGas;
                            double quantidadePercorridaKM = litrosNecessarios * kmLitroGas;
                            distancia -= quantidadePercorridaKM;
                            veiculo.QuantidadeAtualGas -= (quantidadePercorridaKM / kmLitroGas);

                            Console.WriteLine($"\nDistancia percorrida com sucesso! \n");
                        }
                    }

                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("\nVocê concluiu o percurso total\n");
                    Console.ResetColor();
                }
            }
            return(new Viagem {
                VeiculoViagem = veiculo, PercursoViagem = percurso, StatusViagem = "Viagem Concluida"
            });
        }
        public void Abastecer(List <Veiculo> veiculos, bool calibrar = true)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("\n===== Abastecer =====\n");
            Console.ResetColor();

            MostarVeiculo(veiculos, false);
            Console.WriteLine("Escolha um veiculo? \n Insira o numero: ");
            uint opcaoVeiculo;

            while (!uint.TryParse(Console.ReadLine(), out opcaoVeiculo))
            {
                Console.WriteLine("Invalido! Escolha um veiculo? \n Insira o numero: ");
            }

            Veiculo veiculo = veiculos.Find(buscaVeiculo => buscaVeiculo.IdVeiculo == opcaoVeiculo);

            if (veiculo.Flex == true)                                                                  // se for flex
            {
                Console.WriteLine("Qual combustivel você quer abastecer?  \n A- Alcool  G- Gasolina"); //pergunta o tipo de combustivel que deseja
                string opcaoAbastecer = Console.ReadLine().ToUpper();
                while (opcaoAbastecer != "A" && opcaoAbastecer != "G")                                 // validação
                {
                    Console.WriteLine("\nInvalido! Qual é o tipo do combuistivel: \n A- Alcool  G- Gasolina");
                    opcaoAbastecer = Console.ReadLine().ToUpper();
                }

                //----------------------------------------------------------------------------------------------------------------------

                if (opcaoAbastecer == "A")                                    // se quiser abastecer alcool
                {
                    Console.WriteLine("Deseja completar o tanque? (S ou N)"); //opcao de completar
                    string opcaoCompletar = Console.ReadLine().Trim().ToUpper();

                    while (opcaoCompletar != "S" && opcaoCompletar != "N")//validacao completar
                    {
                        Console.WriteLine("Invalido! Deseja completar o tanque do veiculo? (S ou N) ");
                        opcaoCompletar = Console.ReadLine().ToUpper().Trim();
                    }

                    if (opcaoCompletar == "S")// se quiser completar
                    {
                        double completar = veiculo.CapacidadeTanque - (veiculo.QuantidadeAtualAlcool + veiculo.QuantidadeAtualGas);
                        veiculo.QuantidadeAtualAlcool += completar;

                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                        Console.ResetColor();
                    }
                    else // se não quiser completar
                    {
                        double aux;
                        Console.WriteLine("Quantos litros de alcool você quer abastecer? ");
                        while ((!double.TryParse(Console.ReadLine(), out aux) || aux <= 0))
                        {
                            Console.WriteLine("Invalido! Quantos litros de alcool você quer abastecer: ");
                        }

                        if (veiculo.CapacidadeTanque >= aux + (veiculo.QuantidadeAtualAlcool + veiculo.QuantidadeAtualGas))
                        {
                            veiculo.QuantidadeAtualAlcool += aux;
                            Console.ForegroundColor        = ConsoleColor.Green;
                            Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                            Console.ResetColor();
                        }
                        else
                        {
                            Console.WriteLine("\n A quantidade que você quer colocar ultrapassa o limite! \n");
                        }
                    }
                }

                //----------------------------------------------------------------------------------------------------------------------

                else // se quiser abastecer gasolina
                {
                    Console.WriteLine("Deseja completar o tanque? (S ou N)");
                    string opcaoCompletar = Console.ReadLine().Trim().ToUpper();
                    while (opcaoCompletar != "S" && opcaoCompletar != "N")
                    {
                        Console.WriteLine("Invalido! Deseja completar o tanque do veiculo? (S ou N) ");
                        opcaoCompletar = Console.ReadLine().ToUpper().Trim();
                    }
                    if (opcaoCompletar == "S")
                    {
                        double completar = veiculo.CapacidadeTanque - (veiculo.QuantidadeAtualGas + veiculo.QuantidadeAtualAlcool);
                        veiculo.QuantidadeAtualGas += completar;

                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                        Console.ResetColor();
                    }
                    else
                    {
                        double aux;
                        Console.WriteLine("Quantos litros de gasolina você quer abastecer? ");
                        while ((!double.TryParse(Console.ReadLine(), out aux) || aux <= 0))
                        {
                            Console.WriteLine("Invalido! Quantos litros de gasolina você quer abastecer: ");
                        }

                        if (veiculo.CapacidadeTanque >= aux + (veiculo.QuantidadeAtualGas + veiculo.QuantidadeAtualAlcool))
                        {
                            veiculo.QuantidadeAtualGas += aux;
                            Console.ForegroundColor     = ConsoleColor.Green;
                            Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                            Console.ResetColor();
                        }
                        else
                        {
                            Console.WriteLine("\n A quantidade que você quer colocar ultrapassa o limite! \n");
                        }
                    }
                }
            }

            //----------------------------------------------------------------------------------------------------------------------

            else // se não for flex
            {
                if (veiculo.TipoCombustivel == "A") // se o carro for alcool
                {
                    Console.WriteLine("Deseja completar o tanque? (S ou N)"); //opcao de completar
                    string opcaoCompletar = Console.ReadLine().Trim().ToUpper();

                    while (opcaoCompletar != "S" && opcaoCompletar != "N")//validacao completar
                    {
                        Console.WriteLine("Invalido! Deseja completar o tanque do veiculo? (S ou N) ");
                        opcaoCompletar = Console.ReadLine().ToUpper().Trim();
                    }
                    if (opcaoCompletar == "S")// se quiser completar
                    {
                        double completar = veiculo.CapacidadeTanque - veiculo.QuantidadeAtualAlcool;
                        veiculo.QuantidadeAtualAlcool += completar;

                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                        Console.ResetColor();
                    }
                    else
                    {
                        double aux;
                        Console.WriteLine("Quantos litros de alcool você quer abastecer? ");
                        while ((!double.TryParse(Console.ReadLine(), out aux) || aux <= 0))
                        {
                            Console.WriteLine("Invalido! Quantos litros de alcool você quer abastecer: ");
                        }

                        if (veiculo.CapacidadeTanque >= aux + veiculo.QuantidadeAtualAlcool)
                        {
                            veiculo.QuantidadeAtualAlcool += aux;
                            Console.ForegroundColor        = ConsoleColor.Green;
                            Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                            Console.ResetColor();
                        }
                        else
                        {
                            Console.WriteLine("\n A quantidade que você quer colocar ultrapassa o limite! \n");
                        }
                    }
                }

                //----------------------------------------------------------------------------------------------------------------------

                else
                {
                    Console.WriteLine("Deseja completar o tanque? (S ou N)");
                    string opcaoCompletar = Console.ReadLine().Trim().ToUpper();
                    while (opcaoCompletar != "S" && opcaoCompletar != "N")
                    {
                        Console.WriteLine("Invalido! Deseja completar o tanque o veiculo? (S ou N) ");
                        opcaoCompletar = Console.ReadLine().ToUpper().Trim();
                    }
                    if (opcaoCompletar == "S")
                    {
                        double completar = veiculo.CapacidadeTanque - veiculo.QuantidadeAtualGas;
                        veiculo.QuantidadeAtualGas += completar;

                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                        Console.ResetColor();
                    }
                    else
                    {
                        double aux;
                        Console.WriteLine("Quantos litros de gasolina você quer abastecer? ");
                        while ((!double.TryParse(Console.ReadLine(), out aux) || aux <= 0))
                        {
                            Console.WriteLine("Invalido! Quantos litros de gasolina você quer abastecer: ");
                        }

                        if (veiculo.CapacidadeTanque >= aux + veiculo.QuantidadeAtualGas)
                        {
                            veiculo.QuantidadeAtualGas += aux;
                            Console.ForegroundColor     = ConsoleColor.Green;
                            Console.WriteLine("\n Veiculo abastecido com sucesso\n");
                            Console.ResetColor();
                        }
                        else
                        {
                            Console.WriteLine("\n A quantidade que você quer colocar ultrapassa o limite! \n");
                        }
                    }
                }
            }
            if (calibrar)
            {
                Console.WriteLine("Deseja calibrar o pneu? (S ou N)"); //opcao de completar
                string opcaoCalibrar = Console.ReadLine().Trim().ToUpper();

                while (opcaoCalibrar != "S" && opcaoCalibrar != "N")//validacao completar
                {
                    Console.WriteLine("Invalido! Deseja completar o tanque do veiculo? (S ou N) ");
                    opcaoCalibrar = Console.ReadLine().ToUpper().Trim();
                }

                if (opcaoCalibrar == "S")
                {
                    CalibrarPneu(veiculos);
                }
                else
                {
                    Console.WriteLine("\n Você optou por não calibrar! ");
                }
            }
        }