# frozen_string_literal: true

require "value_semantics/monkey_patched"

class GeoCode
	def self.for(data)
		new(data)
	end

	def initialize(data)
		@data = data
	end

	def country
		return "US" unless @data["postal"]
		return "US" if @data["postal"] =~ /\A\d+\Z/

		"CA"
	end

	def sql_point
		"POINT(#{'%.10f' % @data['longt']} #{'%.10f' % @data['latt']})"
	end

	def valid?
		@data["longt"] && @data["latt"]
	end

	# geocoder.ca is Canadian; for US coordinates the top-level "prov"/"city"
	# may reflect Canadian conventions, so prefer the "usa" sub-object when present

	# @return [String, nil]
	def city
		if @data["usa"]
			@data["usa"]["uscity"]
		else
			@data["city"]
		end
	end

	# @return [String, nil]
	def state
		if @data["usa"]
			@data["usa"]["state"]
		else
			@data["prov"]
		end
	end
end
