# frozen_string_literal: true

require "jennifer"
require_relative "message"

class Webhook
	# @param redis [RedisClient]
	def initialize(redis)
		@redis = redis
	end

	INBOUND_TYPES = ["message-received"]
	OUTBOUND_TYPES = ["message-delivered", "message-failed"]

	include Jennifer.rant(self) {
		time { iso8601 }
		type {
			choose(*(INBOUND_TYPES + OUTBOUND_TYPES))
		}
		direction derived_from(:type) { |type|
			if INBOUND_TYPES.include?(type)
				"in"
			elsif OUTBOUND_TYPES.include?(type)
				"out"
			else
				raise "Generated bad webhook type #{type}"
			end
		}, transient: true
		description { string }
		to { nanpa_phone }

		jid(transient: true) { bare_jid }
		registered(transient: true) { true }
		resend_id(transient: true) {
			"#{sized(13) { string(/[0-9]/) }}-#{range(0, 99)}"
		}
		message derived_from(:registered, :jid, :direction, :to) { |registered, jid, direction, to|
			Message.new(@redis).generate(registered, jid, direction, to)
		}
		written_state(transient: true) {
			SGXbwmsgsv2.instance_variable_set(:@written, [])
		}
	}
end
