/// <summary>
        /// Generates correct orbit for both similar as well as non similar destination
        /// </summary>
        /// <param name="orbits"></param>
        /// <param name="climate"></param>
        /// <param name="isSameDestination"></param>
        /// <returns></returns>
        public static List <CorrectOrbit> GenerateCorrectRoute(Orbit[] orbits, Climate climate, bool isSameDestination)
        {
            if (!isSameDestination)
            {
                double overallCarTime = Double.MaxValue;
                KeyValuePair <Orbit, double> carShortestPathToD2;
                orbits[2].IsBreakJourney = true;
                orbits[3].IsBreakJourney = true;
                GetShortestPathToD1(orbits, climate, out KeyValuePair <Orbit, double> carShortestPathToD1,
                                    out KeyValuePair <Orbit, double> bikeShortestPathToD1,
                                    out KeyValuePair <Orbit, double> ttShortestPathToD1);
                orbits[2].IsBreakJourney = false;
                if (carShortestPathToD1.Key.IsBreakJourney)
                {
                    carShortestPathToD2 = ShortestPathGenerator.GenerateShortestPathForVehicle(new Orbit[] { orbits[2] }, climate, new Car());
                    overallCarTime      = carShortestPathToD1.Value;
                }
                else
                {
                    carShortestPathToD1.Key.IsBreakJourney = true;
                    carShortestPathToD2 = ShortestPathGenerator.GenerateShortestPathForVehicle(new Orbit[] { carShortestPathToD1.Key, orbits[3] }, climate, new Car());
                    carShortestPathToD1.Key.IsBreakJourney = false;
                    overallCarTime = carShortestPathToD2.Value;
                }
                double overallBikeTime = Double.MaxValue;
                KeyValuePair <Orbit, double> bikeShortestPathToD2;
                if (bikeShortestPathToD1.Key.IsBreakJourney)
                {
                    bikeShortestPathToD2 = ShortestPathGenerator.GenerateShortestPathForVehicle(new Orbit[] { orbits[2] }, climate, new Bike());
                    overallBikeTime      = bikeShortestPathToD1.Value;
                }
                else
                {
                    bikeShortestPathToD1.Key.IsBreakJourney = true;
                    bikeShortestPathToD2 = ShortestPathGenerator.GenerateShortestPathForVehicle(new Orbit[] { bikeShortestPathToD1.Key, orbits[3] }, climate, new Bike());
                    bikeShortestPathToD1.Key.IsBreakJourney = false;
                    overallBikeTime = bikeShortestPathToD2.Value;
                }
                KeyValuePair <Orbit, double> ttShortestPathToD2;
                double ttOverAllTime = Double.MaxValue;
                if (ttShortestPathToD1.Key.IsBreakJourney)
                {
                    ttShortestPathToD2 = ShortestPathGenerator.GenerateShortestPathForVehicle(new Orbit[] { orbits[2] }, climate, new TukTuk());
                    ttOverAllTime      = ttShortestPathToD1.Value;
                }
                else
                {
                    ttShortestPathToD1.Key.IsBreakJourney = true;
                    ttShortestPathToD2 = ShortestPathGenerator.GenerateShortestPathForVehicle(new Orbit[] { ttShortestPathToD1.Key, orbits[3] }, climate, new TukTuk());
                    ttOverAllTime      = ttShortestPathToD2.Value;
                }
                var shortestPath = new List <CorrectOrbit>();
                shortestPath = overallCarTime < overallBikeTime &&
                               overallCarTime < ttOverAllTime?GenerateCorrectOrbit(new
                                                                                   List <KeyValuePair <Orbit, double> >() { carShortestPathToD1, carShortestPathToD2 },
                                                                                   Vehicle.Car) :
                                   ttOverAllTime < overallBikeTime?
                                   GenerateCorrectOrbit(new
                                                        List <KeyValuePair <Orbit, double> >() { ttShortestPathToD1, ttShortestPathToD2 },
                                                        Vehicle.TukTuk) :
                                       GenerateCorrectOrbit(new
                                                            List <KeyValuePair <Orbit, double> >()
                {
                    bikeShortestPathToD1, bikeShortestPathToD2
                },
                                                            Vehicle.Bike);

                return(shortestPath);
            }
            else
            {
                return(GetSameDestinationCorrectOrbit(orbits, climate));
            }
        }
 private static void GetShortestPathToD1(Orbit[] orbits, Climate climate, out KeyValuePair <Orbit, double> carShortestPathToD1, out KeyValuePair <Orbit, double> bikeShortestPathToD1, out KeyValuePair <Orbit, double> ttShortestPathToD1)
 {
     carShortestPathToD1  = ShortestPathGenerator.GenerateShortestPathForVehicle(orbits, climate, new Car());
     bikeShortestPathToD1 = ShortestPathGenerator.GenerateShortestPathForVehicle(orbits, climate, new Bike());
     ttShortestPathToD1   = ShortestPathGenerator.GenerateShortestPathForVehicle(orbits, climate, new TukTuk());
 }