class Geocoder::Lookup::Esri

def base_query_url(query)

def base_query_url(query)
  action = query.reverse_geocode? ? "reverseGeocode" : "find"
  "#{protocol}://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/#{action}?"
end

def cache_key(query)

def cache_key(query)
  base_query_url(query) + hash_to_query(cache_key_params(query))
end

def cache_key_params(query)

def cache_key_params(query)
  # omit api_key and token because they may vary among requests
  query_url_params(query).reject do |key,value|
    [:api_key, :token].include?(key)
  end
end

def create_and_save_token!

def create_and_save_token!
  save_token!(create_token)
end

def create_token

def create_token
  Geocoder::EsriToken.generate_token(*configuration.api_key)
end

def name

def name
  "Esri"
end

def query_url(query)

def query_url(query)
  base_query_url(query) + url_query_string(query)
end

def query_url_params(query)

def query_url_params(query)
  params = {
    :f => "pjson",
    :outFields => "*"
  }
  if query.reverse_geocode?
    params[:location] = query.coordinates.reverse.join(',')
  else
    params[:text] = query.sanitized_text
  end
  params[:token] = token
  params[:forStorage] = configuration[:for_storage] if configuration[:for_storage]
  params[:sourceCountry] = configuration[:source_country] if configuration[:source_country]
  params.merge(super)
end

def results(query)

def results(query)
  return [] unless doc = fetch_data(query)
  if (!query.reverse_geocode?)
    return [] if !doc['locations'] || doc['locations'].empty?
  end
  if (doc['error'].nil?)
    return [ doc ]
  else
    return []
  end
end

def save_token!(token_instance)

def save_token!(token_instance)
  Geocoder.merge_into_lookup_config(:esri, token: token_instance)
end

def token

def token
  create_and_save_token! if !valid_token_configured? and configuration.api_key
  configuration[:token].to_s unless configuration[:token].nil?
end

def valid_token_configured?

def valid_token_configured?
  !configuration[:token].nil? and configuration[:token].active?
end