# frozen_string_literal: true require "value_semantics/monkey_patched" class CallAttempt EXPENSIVE_ROUTE = { "usd_beta_unlimited-v20210223" => 0.9, "cad_beta_unlimited-v20210223" => 1.1 }.freeze def self.for(customer, other_tel, rate, usage, digits) included_credit = [customer.minute_limit.to_d - usage, 0].max if !rate || rate >= EXPENSIVE_ROUTE.fetch(customer.plan_name, 0.1) Unsupported.new elsif included_credit + customer.balance < rate * 10 NoBalance.new(balance: customer.balance) else for_ask_or_go(customer, other_tel, rate, usage, digits) end end def self.for_ask_or_go(customer, other_tel, rate, usage, digits) can_use = customer.minute_limit.to_d + customer.monthly_overage_limit if digits != "1" && can_use - usage < rate * 10 AtLimit.new else new(from: customer.registered?.phone, to: other_tel) end end value_semantics do from(/\A\+\d+\Z/) to(/\A\+\d+\Z/) end def to_render [:forward, { locals: to_h }] end class Unsupported def to_render ["outbound/unsupported"] end end class NoBalance value_semantics do balance Numeric end def to_render ["outbound/no_balance", { locals: to_h }] end end class AtLimit def to_render ["outbound/at_limit"] end end end