using System.Collections.Generic;
namespace FlightRoutesCalculatorApp.Model
public class FlightRoutesViewModel
[JsonProperty("outboundFlights")]
public IEnumerable<Flight> Outbound { get; set; }
[JsonProperty("inboundFlights")]
public IEnumerable<Flight> Inbound { get; set; }
public Tuple<Flight, Flight> CheapestFlightRoute { get; set; }
public override string ToString()
return JsonConvert.SerializeObject(this);
public string Id { get; set; }
[JsonProperty("airline")]
public string Airline { get; set; }
[JsonProperty("departureAirportCode")]
public string OriginCode { get; set; }
[JsonProperty("arrivalAirportCode")]
public string DestinationCode { get; set; }
public float Price { get; set; }
public IEnumerable<Flight> PossibleReturnFlights { get; set; }
public override string ToString()
return JsonConvert.SerializeObject(this);
namespace FlightRoutesCalculatorApp.Model.Services
public interface IFlightsProvider
FlightRoutesViewModel GetAllAvailableFlights();
public interface IRouteCalculator
Tuple<Flight, Flight> GetCheapestFlightRoute(IEnumerable<Flight> outboundFlights);
IEnumerable<Flight> GetPossibleReturnFlightsOrderedByPrice(Flight outboundFlight, IEnumerable<Flight> inboundFlights);
namespace FlightRoutesCalculatorApp.Model.Services.Implementation
public class MockyFlightsProvider : IFlightsProvider
private const string MOCKY_URI = "http://www.mocky.io/v2/5cebcb7d330000cc296d7772";
public FlightRoutesViewModel GetAllAvailableFlights()
using (var client = new WebClient())
var flightsString = client.DownloadString(MOCKY_URI);
return JsonConvert.DeserializeObject<FlightRoutesViewModel>(flightsString);
public class BasicRouteCalculator : IRouteCalculator
public Tuple<Flight, Flight> GetCheapestFlightRoute(IEnumerable<Flight> outboundFlights)
Tuple<Flight, Flight> cheapestRoute = null;
foreach (var outFlight in outboundFlights)
if (minPrice > 0 && outFlight.Price > minPrice)
if (outFlight.PossibleReturnFlights == null || !outFlight.PossibleReturnFlights.Any())
var cheapestInFlight = outFlight.PossibleReturnFlights.First();
var price = outFlight.Price + cheapestInFlight.Price;
if (minPrice < 0 || minPrice > price)
cheapestRoute = new Tuple<Flight, Flight>(outFlight, cheapestInFlight);
public IEnumerable<Flight> GetPossibleReturnFlightsOrderedByPrice(Flight outboundFlight, IEnumerable<Flight> inboundFlights)
var possibleReturnFlights = inboundFlights.Where(flight => flight.OriginCode == outboundFlight.DestinationCode
&& flight.DestinationCode == outboundFlight.OriginCode);
if (possibleReturnFlights.Any(flight => flight.Airline == outboundFlight.Airline))
possibleReturnFlights = possibleReturnFlights.Where(flight => flight.Airline == outboundFlight.Airline);
return possibleReturnFlights.OrderBy(flight => flight.Price);