# frozen_string_literal: true

class PaymentMethods
	def self.for(braintree_customer, badcards)
		methods = braintree_customer.payment_methods.reject { |m|
			badcards.include?(m.unique_number_identifier) ||
				(m.respond_to?(:expired?) && m.expired?)
		}
		if methods.empty?
			Empty.new
		else
			new(methods)
		end
	end

	def initialize(methods)
		@methods = methods
	end

	def fetch(idx)
		@methods.fetch(idx)
	end

	def default_payment_method
		@methods.find(&:default?)
	end

	def default_payment_method_index
		@methods.index(&:default?)&.to_s
	end

	def to_options
		@methods.map.with_index do |method, idx|
			{
				value: idx.to_s,
				label: "#{method.card_type} #{method.last_4}"
			}
		end
	end

	def to_list_single(**kwargs)
		{
			var: "payment_method",
			type: "list-single",
			label: "Credit card to pay with",
			required: true,
			value: default_payment_method_index,
			options: to_options
		}.merge(kwargs)
	end

	def empty?
		false
	end

	def to_a
		@methods
	end

	class Empty < PaymentMethods
		def initialize; end

		def default_payment_method; end

		def to_list_single(*)
			raise "No payment methods available"
		end

		def empty?
			true
		end

		def to_a
			[]
		end
	end
end
