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