module VatsimTools

  class StationParser

    %w{tmpdir csv}.each { |lib| require lib }
    require_relative "data_downloader"
    require_relative "station"

    attributes = %w{role icao excluded gcmap_width gcmap_height}
    attributes.each { |attribute| attr_accessor attribute.to_sym }

    LOCAL_DATA = "#{Dir.tmpdir}/vatsim_online/vatsim_data.json"

    def initialize(icao, args = nil)
      VatsimTools::DataDownloader.new
      args.class == Hash ? @role = determine_role(args) : @role = "all"
      if icao == "ALL"
        @icao = nil
      else
        @icao = icao.upcase.split(',').each { |s| s.strip! }
      end
      @excluded = args[:exclude].upcase if args && args[:exclude]
      @gcmap_width = args[:gcmap_width] if args && args[:gcmap_width]
      @gcmap_height = args[:gcmap_height] if args && args[:gcmap_height]
    end

    def determine_role(args)
      args[:atc] == false ? role = "pilot" : role = "all"
      args[:pilots] == false ? role = "atc" : role = role
      role = "all" if args[:pilots] == false && args[:atc] == false
      role
    end

    def stations
      matching_stations = []
      raw_data = File.read(LOCAL_DATA)
      data = JSON.parse(raw_data)
      pilots = data['pilots'].each { |p| p['role'] = 'pilot' }
      controllers = data['controllers'].each { |p| p['role'] = 'controller' }
      atis = data['atis'].each { |p| p['role'] = 'atis' }
      stations = pilots + controllers + atis
      stations.each do |station|
        callsign = station['callsign']
        destination = station['flight_plan']['arrival'] rescue ''
        origin = station['flight_plan']['departure'] rescue ''
        client = station['role']
        unless @icao
          matching_stations << station if (client == "controller") unless @role == "pilot"
          matching_stations << station if (client == "pilot") unless @role == "atc"
        else
          @icao.each do |icao|
            matching_stations << station if (callsign[0...icao.length] == icao && client == "controller") unless @role == "pilot"
            matching_stations << station if (origin[0...icao.length] == icao || destination[0...icao.length] == icao) unless @role == "atc"
          end
        end
      end
      matching_stations
    end

    def station_objects
      station_objects = []
      args = {}
      args[:gcmap_width] = @gcmap_width if @gcmap_width
      args[:gcmap_height] = @gcmap_height if @gcmap_height
      stations.each { |station| station_objects << VatsimTools::Station.new(station, args) }
      station_objects
    end

    def sorted_station_objects
      atc = []; pilots = []; arrivals = []; departures = []
      station_objects.each { |sobj| sobj.role == "controller" ? atc << sobj : pilots << sobj }
      if @icao
        @icao.each do |icao|
          pilots.each do |pilot|
            departures << pilot if pilot.origin[0...icao.length] == icao
            arrivals << pilot if pilot.destination[0...icao.length] == icao
          end
        end
      end
      atc.delete_if { |a| @excluded && a.callsign[0...@excluded.length] == @excluded }
      { :atc => atc, :pilots => pilots, :arrivals => arrivals, :departures => departures }
    end

  end

end
