# 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 def send_message?(*) false end end class Basement TrustLevel.register do |manual:, settled_amount:, **| new if manual == "Basement" || (!manual && settled_amount < 10) end def support_call?(rate, concurrency) rate <= 0.02 && concurrency < 1 end def send_message?(messages_today) messages_today < 200 end end class Paragon TrustLevel.register do |manual:, settled_amount:, **| new if manual == "Paragon" || (!manual && settled_amount > 60) end def support_call?(_, concurrency) concurrency < 10 end def send_message?(messages_today) messages_today < 700 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, concurrency) rate <= @max_rate && concurrency < 4 end def send_message?(messages_today) messages_today < 500 end end end