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