1# frozen_string_literal: true
2
3require "value_semantics/monkey_patched"
4
5class GeoCode
6 def self.for(data)
7 new(data)
8 end
9
10 def initialize(data)
11 @data = data
12 end
13
14 def country
15 return "US" unless @data["postal"]
16 return "US" if @data["postal"] =~ /\A\d+\Z/
17
18 "CA"
19 end
20
21 def sql_point
22 "POINT(#{'%.10f' % @data['longt']} #{'%.10f' % @data['latt']})"
23 end
24
25 def valid?
26 @data["longt"] && @data["latt"]
27 end
28
29 # geocoder.ca is Canadian; for US coordinates the top-level "prov"/"city" may
30 # reflect Canadian conventions, so prefer the "usa" sub-object when present
31
32 # @return [String, nil]
33 def locality
34 usa? ? @data["usa"]["uscity"] : @data["city"]
35 end
36
37 # @return [String, nil]
38 def region
39 usa? ? @data["usa"]["state"] : @data["prov"]
40 end
41
42 # @returh Hash<Symbol, String>
43 def to_h
44 {
45 locality: locality,
46 region: region,
47 country: country
48 }
49 end
50
51private
52
53 # @return [Boolean]
54 def usa?
55 @data.key?("usa")
56 end
57end