# frozen_string_literal: true

class InvitesRepo
	class Invalid < StandardError; end

	def initialize(db=DB)
		@db = db
	end

	def unused_invites(customer_id)
		promise = @db.query_defer(<<~SQL, [customer_id])
			SELECT code FROM unused_invites WHERE creator_id=$1
		SQL
		promise.then { |result| result.map { |row| row["code"] } }
	end

	def claim_code(customer_id, code, &blk)
		EMPromise.resolve(nil).then do
			@db.transaction do
				valid = @db.exec(<<~SQL, [customer_id, code]).cmd_tuples.positive?
					UPDATE invites SET used_by_id=$1, used_at=LOCALTIMESTAMP
					WHERE code=$2 AND used_by_id IS NULL
				SQL
				raise Invalid, "Not a valid invite code: #{code}" unless valid

				blk.call
			end
		end
	end
end
