# frozen_string_literal: true class PaymentMethods def self.for(braintree_customer, badcards) methods = braintree_customer.payment_methods.reject { |m| badcards.include?(m.unique_number_identifier) } if methods.empty? Empty.new else new(methods) end end def initialize(methods) @methods = methods end def fetch(idx) @methods.fetch(idx) end def default_payment_method @methods.find(&:default?) end def default_payment_method_index @methods.index(&:default?)&.to_s end def to_options @methods.map.with_index do |method, idx| { value: idx.to_s, label: "#{method.card_type} #{method.last_4}" } end end def to_list_single(**kwargs) { var: "payment_method", type: "list-single", label: "Credit card to pay with", required: true, value: default_payment_method_index, options: to_options }.merge(kwargs) end def empty? false end def to_a @methods end class Empty < PaymentMethods def initialize; end def default_payment_method; end def to_list_single(*) raise "No payment methods available" end def empty? true end def to_a [] end end end