# frozen_string_literal: true

require "jennifer"
require_relative "../rantly_extensions/data_extensions"

class PortOutPinExecuteCmd
	# @param redis [FakeRedis]
	def initialize(redis)
		@redis = redis
	end

	include Jennifer.rant(self) {
		jid { bare_jid }
		phone(transient: true) { nanpa_phone }

		stanza derived_from(:jid) do |jid|
			cmd = Blather::Stanza::Iq::Command.new
			cmd.type = :set
			cmd.to = 'component'
			cmd.node = 'set-port-out-pin'
			cmd.action = :execute
			cmd.from = jid
			cmd
		end

		redis_state derived_from(:jid, :phone), transient: true do |jid, phone|
			@redis.reset!
			@redis.rpush("catapult_cred-#{jid}", 'acct', 'token', 'secret', phone)
		end

		written_state(transient: true) {
			SGXbwmsgsv2.instance_variable_set(:@written, [])
		}
	}
end

class PortOutPinCompleteCmd
	# @param redis [FakeRedis]
	def initialize(redis)
		@redis = redis
	end

	include Jennifer.rant(self) {
		jid { bare_jid }
		phone(transient: true) { nanpa_phone }
		pin { sized(range(4, 10)) { string(:alnum) } }
		confirm_pin derived_from(:pin) { |pin| pin }
		sessionid { SecureRandom.uuid }

		stanza derived_from(:jid, :sessionid, :pin, :confirm_pin) do |jid, sid, pin, cpin|
			cmd = Blather::Stanza::Iq::Command.new
			cmd.type = :set
			cmd.to = 'component'
			cmd.node = 'set-port-out-pin'
			cmd.sessionid = sid
			cmd.action = :complete
			cmd.from = jid
			cmd.form.type = :submit
			cmd.form.fields = [
				{ var: 'pin', value: pin },
				{ var: 'confirm_pin', value: cpin }
			]
			cmd
		end

		redis_state derived_from(:jid, :phone), transient: true do |jid, phone|
			@redis.reset!
			@redis.rpush("catapult_cred-#{jid}", 'acct', 'token', 'secret', phone)
		end

		written_state(transient: true) {
			SGXbwmsgsv2.instance_variable_set(:@written, [])
		}
	}
end
