class Geocoder::Result::Yandex

def address(format = :full)

def address(format = :full)
  @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['text']
end

def address_details

def address_details
  @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['AddressDetails']['Country']
end

def admin_locality

def admin_locality
  address_details && address_details['AdministrativeArea'] &&
    address_details['AdministrativeArea']['Locality']
end

def city

def city
  if state.empty? and address_details and address_details.has_key? 'Locality'
    address_details['Locality']['LocalityName']
  elsif sub_state.empty? and address_details and address_details.has_key? 'AdministrativeArea' and
      address_details['AdministrativeArea'].has_key? 'Locality'
    address_details['AdministrativeArea']['Locality']['LocalityName']
  elsif not sub_state_city.empty?
    sub_state_city
  else
    ""
  end
end

def coordinates

def coordinates
  @data['GeoObject']['Point']['pos'].split(' ').reverse.map(&:to_f)
end

def country

def country
  if address_details
    address_details['CountryName']
  else
    ""
  end
end

def country_code

def country_code
  if address_details
    address_details['CountryNameCode']
  else
    ""
  end
end

def dependent_locality

def dependent_locality
  address_details && address_details['AdministrativeArea'] &&
    address_details['AdministrativeArea']['SubAdministrativeArea'] &&
    address_details['AdministrativeArea']['SubAdministrativeArea']['Locality'] &&
    address_details['AdministrativeArea']['SubAdministrativeArea']['Locality']['DependentLocality']
end

def kind

def kind
  @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['kind']
end

def locality_data

def locality_data
  dependent_locality && subadmin_locality && admin_locality
end

def postal_code

def postal_code
  ""
end

def precision

def precision
  @data['GeoObject']['metaDataProperty']['GeocoderMetaData']['precision']
end

def premise_name

def premise_name
  address_details['Locality']['Premise']['PremiseName']
end

def state

def state
  if address_details and address_details['AdministrativeArea']
    address_details['AdministrativeArea']['AdministrativeAreaName']
  else
    ""
  end
end

def state_code

def state_code
  ""
end

def street

def street
  thoroughfare_data && thoroughfare_data['ThoroughfareName']
end

def street_number

def street_number
  thoroughfare_data && thoroughfare_data['Premise'] && thoroughfare_data['Premise']['PremiseNumber']
end

def sub_state

def sub_state
  if !state.empty? and address_details and address_details['AdministrativeArea']['SubAdministrativeArea']
    address_details['AdministrativeArea']['SubAdministrativeArea']['SubAdministrativeAreaName']
  else
    ""
  end
end

def sub_state_city

def sub_state_city
  if !sub_state.empty? and address_details and address_details['AdministrativeArea']['SubAdministrativeArea'].has_key? 'Locality'
    address_details['AdministrativeArea']['SubAdministrativeArea']['Locality']['LocalityName'] || ""
  else
    ""
  end
end

def subadmin_locality

def subadmin_locality
  address_details && address_details['AdministrativeArea'] &&
    address_details['AdministrativeArea']['SubAdministrativeArea'] &&
    address_details['AdministrativeArea']['SubAdministrativeArea']['Locality']
end

def thoroughfare_data

def thoroughfare_data
  locality_data && locality_data['Thoroughfare']
end

def viewport

def viewport
  envelope = @data['GeoObject']['boundedBy']['Envelope'] || fail
  east, north = envelope['upperCorner'].split(' ').map(&:to_f)
  west, south = envelope['lowerCorner'].split(' ').map(&:to_f)
  [south, west, north, east]
end