///|
pub enum RuleProblem {
  NonPositiveDivisor
  NonPositiveWeightStep
  EmptyZones
  InvalidZoneMultiplier(String)
  NegativeFee(String)
} derive(Debug, Eq, ToJson)

///|
pub fn validate_rule(rule : BillingRule) -> Array[RuleProblem] {
  let problems : Array[RuleProblem] = []
  if rule.volumetric_divisor <= 0 {
    problems.push(NonPositiveDivisor)
  }
  if rule.additional_weight_unit_g <= 0 {
    problems.push(NonPositiveWeightStep)
  }
  if rule.zones.is_empty() {
    problems.push(EmptyZones)
  }
  if rule.first_weight_rate.cents < 0 {
    problems.push(NegativeFee("first_weight_rate"))
  }
  if rule.additional_weight_rate.cents < 0 {
    problems.push(NegativeFee("additional_weight_rate"))
  }
  for z in rule.zones {
    if z.multiplier_bp <= 0 {
      problems.push(InvalidZoneMultiplier(z.zone))
    }
    if z.remote_fee.cents < 0 {
      problems.push(NegativeFee("remote_fee:\{z.zone}"))
    }
  }
  problems
}