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 class Empty
54 def default_payment_method; end
55
56 def to_list_single(*)
57 raise "No payment methods available"
58 end
59
60 def empty?
61 true
62 end
63 end
64end