# frozen_string_literal: true module Places class NearbySearch RADIUS_KM = 0.5 MAX_RESULTS = 10 def initialize(latitude:, longitude:, radius: RADIUS_KM, limit: MAX_RESULTS) @latitude = latitude @longitude = longitude @radius = radius @limit = limit end def call return [] unless reverse_geocoding_enabled? results = Geocoder.search( [latitude, longitude], limit: limit, distance_sort: true, radius: radius, units: :km ) format_results(results) rescue StandardError => e Rails.logger.error("Nearby places search error: #{e.message}") [] end private attr_reader :latitude, :longitude, :radius, :limit def reverse_geocoding_enabled? DawarichSettings.reverse_geocoding_enabled? end def format_results(results) results.map do |result| properties = result.data['properties'] || {} coordinates = result.data.dig('geometry', 'coordinates') || [longitude, latitude] { name: extract_name(result.data), latitude: coordinates[1], longitude: coordinates[0], osm_id: properties['osm_id'], osm_type: properties['osm_type'], osm_key: properties['osm_key'], osm_value: properties['osm_value'], city: properties['city'], country: properties['country'], street: properties['street'], housenumber: properties['housenumber'], postcode: properties['postcode'] } end end def extract_name(data) properties = data['properties'] || {} properties['name'] || [properties['street'], properties['housenumber']].compact.join(' ').presence || properties['city'] || 'Unknown Place' end end end