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"
30 # may reflect Canadian conventions, so prefer the "usa" sub-object when present
31
32 # @return [String, nil]
33 def city
34 if @data["usa"]
35 @data["usa"]["uscity"]
36 else
37 @data["city"]
38 end
39 end
40
41 # @return [String, nil]
42 def state
43 if @data["usa"]
44 @data["usa"]["state"]
45 else
46 @data["prov"]
47 end
48 end
49end