BuildMatchingFlightPlan(string id, FlightPlan flightPlan)
        {
            var matchingFlight = await _flightContext.FlightItems.Where(x => x.FlightId == flightPlan.FlightId)
                                 .FirstOrDefaultAsync();

            var matchingInitialLocation = await _flightContext.InitialLocationItems
                                          .Where(x => x.FlightPlanId == flightPlan.Id).FirstOrDefaultAsync();

            InitialLocationData initialData = new InitialLocationData()
            {
                Longitude = matchingInitialLocation.Longitude,
                Latitude  = matchingInitialLocation.Latitude,
                DateTime  = matchingInitialLocation.DateTime
            };
            IEnumerable <Segment> matchingSegments =
                await _flightContext.SegmentItems.Where
                    (x => x.FlightPlanId == flightPlan.Id).ToListAsync();

            IEnumerable <SegmentData> matchingSegmentData = BuildMatchingSegmentData(matchingSegments);
            var flightPlanData = new FlightPlanData
            {
                Passengers      = flightPlan.Passengers,
                CompanyName     = flightPlan.CompanyName,
                InitialLocation = initialData,
                Segments        = matchingSegmentData
            };

            return(flightPlanData);
        }
        /*
         * Parsing the received json into the FlightPlanData object
         */
        private FlightPlanData CreateFlightPlanDataFromJson(dynamic obj)
        {
            FlightPlanData newFlightPlanData = BuildInitialFlightPlanDataObject(obj);

            dynamic segments = obj["segments"];
            IEnumerable <SegmentData> segmentList = new List <SegmentData>();

            foreach (var segment in segments)
            {
                double segmentLongitude = double.Parse(segment["longitude"].ToString());
                double segmentLatitude  = double.Parse(segment["latitude"].ToString());
                int    timeSpanSeconds  = int.Parse(segment["timespan_seconds"].ToString());

                SegmentData newSegment = new SegmentData()
                {
                    Longitude       = segmentLongitude,
                    Latitude        = segmentLatitude,
                    TimeSpanSeconds = timeSpanSeconds
                };
                segmentList = segmentList.Append(newSegment);
            }

            newFlightPlanData.Segments = segmentList;

            return(newFlightPlanData);
        }
        /*
         * Creating an initial FlightPlanData object which will be filled with the remaining fiels later
         */
        private FlightPlanData BuildInitialFlightPlanDataObject(dynamic obj)
        {
            double   longitude = double.Parse(obj["initial_location"]["longitude"].ToString());
            double   latitude  = double.Parse(obj["initial_location"]["latitude"].ToString());
            DateTime dateTime  = obj["initial_location"]["date_time"];

            FlightPlanData newFlightPlanData = new FlightPlanData()
            {
                Passengers      = int.Parse(obj["passengers"].ToString()),
                CompanyName     = obj["company_name"].ToString(),
                InitialLocation = new InitialLocationData()
                {
                    Longitude = longitude,
                    Latitude  = latitude,
                    DateTime  = dateTime
                }
            };

            return(newFlightPlanData);
        }
        /*
         * Getting flights from external servers using a http client
         */
        private async Task <FlightPlanData> GetExternalFlightPlan(string id, Flight flight)
        {
            var _apiUrl      = flight.OriginServer + "/api/FlightPlan/" + flight.FlightId;
            var _baseAddress = flight.OriginServer;

            using (var client = _clientFactory.CreateClient())
            {
                try
                {
                    var result = await client.GetStringAsync(_apiUrl);

                    dynamic        value = JObject.Parse(result);
                    FlightPlanData externalFlightPlanData = CreateFlightPlanDataFromJson(value);
                    return(externalFlightPlanData);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                    return(null);
                }
            }
        }
 public FlightPlanUpdatedEventArgs(FlightPlanData flightPlan)
 {
     FlightPlan = flightPlan;
 }