# 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