# frozen_string_literal: true

require_relative "message_event"

module EventEmitter
	# @param owner_jid [Blather::JID]
	def jid_to_owner(owner_jid)
		REGISTRATION_REPO.find(owner_jid).then { |(tel, *rest)|
			unless MessageEvent::NanpaTel.match?(tel)
				log.warn(
					"Skipping incoming message event: no valid owner mapping",
					jid: owner_jid.to_s, owner: tel.to_s
				)
				next
			end
			yield [tel, *rest] if block_given?
		}
	end

	def emit_incoming_event(
		owner_jid,
		from:, body:, endstream_id:, media_urls: []
	)
		jid_to_owner(owner_jid) { |(tel, *)|
			MessageEvent::In.new(
				owner: tel, from: from, to: [tel], body: body,
				endstream_id: endstream_id, media_urls: media_urls
			).emit(REDIS)
		}.catch do |e|
			log.warn("Failed to emit incoming message event", error: e.message)
		end
	end

	def emit_failed_event(endstream_id:, error_code:, error_description:)
		MessageEvent::Failed.new(
			endstream_id: endstream_id,
			error_code: error_code,
			error_description: error_description
		).emit(REDIS)
	end

	def emit_outgoing_event(
		owner_jid,
		to:, body:, stanza_id:, media_urls: []
	)
		jid_to_owner(owner_jid) { |(owner, *)|
			MessageEvent::Out.new(
				owner: owner, from: owner, to: to, body: body.to_s,
				stanza_id: stanza_id.to_s,
				media_urls: media_urls
			).emit(REDIS)
		}.catch do |e|
			log.warn("Failed to emit outgoing message event", error: e.message)
		end
	end
end
