# 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 locality
		usa? ? @data["usa"]["uscity"] : @data["city"]
	end

	# @return [String, nil]
	def region
		usa? ? @data["usa"]["state"] : @data["prov"]
	end

	# @returh Hash<Symbol, String>
	def to_h
		{
			locality: locality,
			region: region,
			country: country
		}
	end

private

	# @return [Boolean]
	def usa?
		@data.key?("usa")
	end
end
