1# frozen_string_literal: true
 2
 3class PaymentMethods
 4	def self.for(braintree_customer, badcards)
 5		methods = braintree_customer.payment_methods.reject { |m|
 6			badcards.include?(m.unique_number_identifier) ||
 7				(m.respond_to?(:expired?) && m.expired?)
 8		}
 9		if methods.empty?
10			Empty.new
11		else
12			new(methods)
13		end
14	end
15
16	def initialize(methods)
17		@methods = methods
18	end
19
20	def fetch(idx)
21		@methods.fetch(idx)
22	end
23
24	def default_payment_method
25		@methods.find(&:default?)
26	end
27
28	def default_payment_method_index
29		@methods.index(&:default?)&.to_s
30	end
31
32	def to_options
33		@methods.map.with_index do |method, idx|
34			{
35				value: idx.to_s,
36				label: "#{method.card_type} #{method.last_4}"
37			}
38		end
39	end
40
41	def to_list_single(**kwargs)
42		{
43			var: "payment_method",
44			type: "list-single",
45			label: "Credit card to pay with",
46			required: true,
47			value: default_payment_method_index,
48			options: to_options
49		}.merge(kwargs)
50	end
51
52	def empty?
53		false
54	end
55
56	def to_a
57		@methods
58	end
59
60	class Empty < PaymentMethods
61		def initialize; end
62
63		def default_payment_method; end
64
65		def to_list_single(*)
66			raise "No payment methods available"
67		end
68
69		def empty?
70			true
71		end
72
73		def to_a
74			[]
75		end
76	end
77end