public AirportSearchViewModel()
        {
            filteredAirports = new ObservableCollection <Airport>(AirportDataService.ReadAll());

            SortResultsCommand = new MessageCommands(FilterAirportList);
            selectionMade      = new MapCommands(GatherFlightData);
            setMapLatLong      = new MapCommands(SetMapLatLong);
            addToFavorites     = new MapCommands(AddToFavorites);
            openHelp           = new MapCommands(OpenHelp);
            AirportCount       = "Airport Count = " + filteredAirports.Count().ToString();
            Center             = new PointLatLng(39.9, -84.4);
            MapZoom            = 4;
        }
        public void GetFilteredAirports(string searchBoxText)
        {
            //List<Airport> airports = new List<Airport>();
            //airports = AirportDataService.ReadAll();

            List <Airport> airports     = AirportDataService.ReadAll();
            List <Airport> filteredList = airports.Where(a => a.name.ToUpper().Contains(searchBoxText.ToUpper())).ToList();

            foreach (Airport item in filteredList)
            {
                filteredAirports.Add(item);
            }

            if (filteredAirports.Count == 0)
            {
                AirportCount = "Airport Count = " + filteredAirports.Count().ToString() + ". Try to broaden your search!";
            }
            else
            {
                AirportCount = "Airport Count = " + filteredAirports.Count().ToString();
            }
        }
        public void GatherFlightData()
        {
            if (selectedAirport != null)
            {
                //generate airport MasterList
                List <Airport> airportMasterList = AirportDataService.ReadAll();

                //generate view model to send results to
                ViewFlightDataViewModel vm = new ViewFlightDataViewModel();

                //generate url request parameters
                string departureAirport = "depIcao=" + selectedAirport.code;
                string arrivalAirport   = "arrIcao=" + selectedAirport.code;

                //load results in...
                List <FlightData> flightsArrivingToThisAirport = AviationEdgeAPIDataService.GetCurrentFlightData(arrivalAirport, out APIErrorCode arrivalFlightsError);
                //add second request
                List <FlightData> flightsLeavingThisAirport = AviationEdgeAPIDataService.GetCurrentFlightData(departureAirport, out APIErrorCode departureFlightsError);

                ////Test purpose
                //List<FlightData> test = AviationEdgeAPIDataService.ReadAll();


                if (arrivalFlightsError == APIErrorCode.VALIDFLIGHTDATA)
                {
                    foreach (FlightData item in flightsArrivingToThisAirport)
                    {
                        vm.flightDataRecords.Add(item);

                        GMapMarker marker = GenerateDestinationMarkers(item, airportMasterList, out MarkerErrorCode destinationMarkerErrorCode);
                        if (destinationMarkerErrorCode == MarkerErrorCode.VALID)
                        {
                            vm.flightsOnRouteToThisAirport.Add(marker);
                        }
                        else
                        {
                            errorList.Add("Destination marker missing for flight number: " + item.flight.number);
                        }
                        GMapMarker airplaneMarker = GenerateMapAirplaneMarkers(item, out MarkerErrorCode planeMarkerError);
                        if (planeMarkerError == MarkerErrorCode.VALID)
                        {
                            vm.flightsOnRouteToThisAirport.Add(airplaneMarker);
                        }
                        else
                        {
                            errorList.Add("Airplane marker missing for flight number: " + item.flight.number);
                        }
                        GMapPolygon gMapPolygon = GenerateMapRoutesFromDep(item, airportMasterList, out MarkerErrorCode errorCode);
                        if (errorCode == MarkerErrorCode.VALID)
                        {
                            vm.flightsOnRouteToThisAirport.Add(gMapPolygon);
                        }
                        else
                        {
                            errorList.Add("Partial map route missing for flight number: " + item.flight.number);
                        }
                        GMapPolygon routeFromFlightToArrv = GenerateMapRoutesFromCurrentToArv(item, airportMasterList, out MarkerErrorCode routeToError);
                        if (routeToError == MarkerErrorCode.VALID)
                        {
                            vm.flightsOnRouteToThisAirport.Add(routeFromFlightToArrv);
                        }
                        else
                        {
                            errorList.Add("Partial map route missing for flight number: " + item.flight.number);
                        }
                    }
                }
                if (departureFlightsError == APIErrorCode.VALIDFLIGHTDATA)
                {
                    foreach (FlightData item in flightsLeavingThisAirport)
                    {
                        vm.flightDataRecords.Add(item);
                        GMapMarker destinationMarker = GenerateDestinationMarkers(item, airportMasterList, out MarkerErrorCode destinationMarkerError);
                        if (destinationMarkerError == MarkerErrorCode.VALID)
                        {
                            vm.mapMarkers.Add(destinationMarker);
                        }
                        else
                        {
                            errorList.Add("Destination marker missing for flight number: " + item.flight.number);
                        }
                        GMapMarker airplaneIcon = GenerateMapAirplaneMarkers(item, out MarkerErrorCode airplaneIconError);
                        if (airplaneIconError == MarkerErrorCode.VALID)
                        {
                            vm.mapMarkers.Add(airplaneIcon);
                        }
                        else
                        {
                            errorList.Add("Airplane marker missing for flight number: " + item.flight.number);
                        }
                        GMapPolygon fromDep = GenerateMapRoutesFromDep(item, airportMasterList, out MarkerErrorCode routeFromDepError);
                        if (routeFromDepError == MarkerErrorCode.VALID)
                        {
                            vm.mapMarkers.Add(fromDep);
                        }
                        else
                        {
                            errorList.Add("Partial map route missing for flight number: " + item.flight.number);
                        }
                        GMapPolygon toArriv = GenerateMapRoutesFromCurrentToArv(item, airportMasterList, out MarkerErrorCode routeToArrvError);
                        if (routeToArrvError == MarkerErrorCode.VALID)
                        {
                            vm.mapMarkers.Add(toArriv);
                        }
                        else
                        {
                            errorList.Add("Partial map route missing for flight number: " + item.flight.number);
                        }
                    }
                }
                if (arrivalFlightsError == APIErrorCode.INVALIDFLIGHTDATA && departureFlightsError == APIErrorCode.INVALIDFLIGHTDATA)
                {
                    MessageBox.Show($"There are no flights found arriving or departing {selectedAirport.name}");
                }
                else
                {
                    vm.airport     = selectedAirport;
                    vm.RecordCount = "Flight Count= " + vm.flightDataRecords.Count.ToString();
                    foreach (string error in errorList)
                    {
                        vm.errors.Add(error);
                    }
                    vm.ErrorLabel = $"Errors({errorList.Count()})";
                    vm.Center     = new PointLatLng(double.Parse(selectedAirport.lat), double.Parse(selectedAirport.lon));
                    ViewFlightData viewFlightDataUI = new ViewFlightData(vm);
                    viewFlightDataUI.Show();
                    errorList.Clear();
                }
            }
            else
            {
                //If no airport has been selected...
                MessageBox.Show("No Airport Selection Has Been Made! Please select an airport or click 'Help' for more information.");
            }
        }
        public List <Airport> GetAirports()
        {
            List <Airport> airports = new List <Airport>();

            return(airports = AirportDataService.ReadAll());
        }