# frozen_string_literal: true

class Addresses < Blather::XMPPNode
	include Enumerable

	register :addresses, "http://jabber.org/protocol/address"

	def self.new(addresses)
		new_node = super(:addresses)

		if addresses.is_a?(Array)
			addresses.each do |address|
				new_node << Address.new(**address)
			end
		end

		new_node
	end

	def self.import(node)
		ns = node.namespace&.href
		klass = class_from_registration(node.element_name, ns)
		# For some reason blather tries to import a message with us as a child as us
		# So if we don't override this it leads to infinite recursion
		if klass == Blather::Stanza::Message
			Blather::Stanza::Message.new(node[:type]).inherit(node)
		else
			super
		end
	end

	def each
		find("./ns:address", ns: self.class.registered_ns).each do |node|
			yield Address.import(node)
		end
	end

	class Address < Blather::XMPPNode
		register :address, "http://jabber.org/protocol/address"

		def self.new(*, type: nil, jid: nil, uri: nil, delivered: nil)
			new_node = super(:address)
			new_node["type"] = type
			new_node["jid"] = jid if jid
			new_node["uri"] = uri if uri
			new_node["delivered"] = delivered.to_s unless delivered.nil?
			new_node
		end

		def type
			self["type"]
		end

		def jid
			if self["jid"]
				Blather::JID.new(self["jid"])
			else
				Blather::JID.new(uri.sub(/\Asms:\+?/, ""), "mms.chat.1pcom.net")
			end
		end

		def uri
			self["uri"]
		end

		def delivered?
			self["delivered"] == "true"
		end
	end
end
