# frozen_string_literal: true module TrustLevel def self.for(plan_name:, settled_amount: 0, manual: nil) @levels.each do |level| tl = level.call( plan_name: plan_name, settled_amount: settled_amount, manual: manual ) return tl if tl end raise "No TrustLevel matched" end def self.register(&maybe_mk) @levels ||= [] @levels << maybe_mk end class Tomb TrustLevel.register do |manual:, **| new if manual == "Tomb" end def support_call?(*) false end end class Basement TrustLevel.register do |manual:, settled_amount:, **| new if manual == "Basement" || (!manual && settled_amount < 10) end def support_call?(rate) rate <= 0.02 end end class Paragon TrustLevel.register do |manual:, settled_amount:, **| new if manual == "Paragon" || (!manual && settled_amount > 60) end def support_call?(*) true end end class Customer TrustLevel.register do |manual:, plan_name:, **| if manual && manual != "Customer" Sentry.capture_message("Unknown TrustLevel: #{manual}") end new(plan_name) end EXPENSIVE_ROUTE = { "usd_beta_unlimited-v20210223" => 0.9, "cad_beta_unlimited-v20210223" => 1.1 }.freeze def initialize(plan_name) @max_rate = EXPENSIVE_ROUTE.fetch(plan_name, 0.1) end def support_call?(rate) rate <= @max_rate end end end