///|
pub fn analyze_parcel(parcel : ParcelDim) -> ParcelProfile {
  let longest = parcel.longest_side_cm()
  let shortest = parcel.width_cm.min(parcel.height_cm).min(parcel.depth_cm)
  let middle = parcel.width_cm +
    parcel.height_cm +
    parcel.depth_cm -
    longest -
    shortest
  let girth = 2 * (middle + shortest)
  let footprint = middle * shortest
  let surface = 2 *
    (
      parcel.width_cm * parcel.height_cm +
      parcel.width_cm * parcel.depth_cm +
      parcel.height_cm * parcel.depth_cm
    )
  let volume = parcel.volume_cm3().max(1)
  {
    longest_side_cm: longest,
    shortest_side_cm: shortest,
    middle_side_cm: middle,
    girth_cm: girth,
    footprint_cm2: footprint,
    surface_area_cm2: surface,
    density_g_per_l: parcel.weight_g * 1000 / volume,
  }
}

///|
pub fn ParcelDim::normalized(self : ParcelDim) -> ParcelDim {
  {
    width_cm: self.width_cm.max(0),
    height_cm: self.height_cm.max(0),
    depth_cm: self.depth_cm.max(0),
    weight_g: self.weight_g.max(0),
  }
}

///|
pub fn ParcelDim::is_valid(self : ParcelDim) -> Bool {
  self.width_cm > 0 &&
  self.height_cm > 0 &&
  self.depth_cm > 0 &&
  self.weight_g > 0
}

///|
pub fn ParcelDim::chargeable_volume_l(self : ParcelDim) -> Int {
  (self.volume_cm3() + 999) / 1000
}

///|
pub fn ParcelDim::dimensional_density(self : ParcelDim) -> Int {
  let volume = self.volume_cm3()
  if volume <= 0 {
    0
  } else {
    self.weight_g * 1000 / volume
  }
}