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