// CLI 与网页共用的打印前检查结论。检查通过不代表制造过程保证。

///|
pub(all) struct PrintabilityReport {
  validation : ValidationReport
  winding : WindingReport
  thickness : ThicknessReport?
  /// 用户指定的参考壁厚,毫米;0 表示不设薄壁阈值。
  min_thickness : Double
}

///|
pub fn check_printability(
  mesh : Mesh,
  min_thickness : Double,
  samples? : Int = DEFAULT_THICKNESS_SAMPLES,
) -> PrintabilityReport {
  let validation = validate_default(mesh)
  let winding = check_winding_default(mesh)
  let thickness = if mesh.is_empty() ||
    !validation.is_watertight() ||
    validation.degenerate_count > 0 ||
    winding.flipped_faces > 0 ||
    !winding.orientation_reliable() {
    None
  } else {
    Some(check_thickness(mesh, samples))
  }
  { validation, winding, thickness, min_thickness, }
}

///|
/// 确定为负体积的闭合分量数;负号也可能对应合法内腔,需要复核。
/// 从分量明细计算,避免与 winding.components 保存重复且可能不一致的计数。
pub fn PrintabilityReport::inward_component_count(
  self : PrintabilityReport,
) -> Int {
  self.winding.negative_components()
}

///|
pub fn PrintabilityReport::inward(self : PrintabilityReport) -> Bool {
  self.inward_component_count() > 0
}

///|
/// CLI / 网页输出质量属性的几何前提,与参考壁厚阈值无关。
/// 不验证自相交、全部非流形顶点或浮点计算精度;报告须对应同一网格。
pub fn PrintabilityReport::mass_properties_available(
  self : PrintabilityReport,
) -> Bool {
  self.validation.triangle_count > 0 &&
  self.validation.is_watertight() &&
  self.validation.degenerate_count == 0 &&
  self.winding.consistent &&
  self.winding.flipped_faces == 0 &&
  self.winding.orientation_reliable()
}

///|
pub fn PrintabilityReport::thin_wall(self : PrintabilityReport) -> Bool {
  match self.thickness {
    Some(r) =>
      r.hits > 0 &&
      self.min_thickness > 0.0 &&
      r.min_thickness < self.min_thickness
    None => false
  }
}

///|
pub fn PrintabilityReport::thickness_unavailable(
  self : PrintabilityReport,
) -> Bool {
  match self.thickness {
    Some(r) => r.hits == 0
    None => true
  }
}

///|
pub fn PrintabilityReport::needs_review(self : PrintabilityReport) -> Bool {
  self.min_thickness.is_nan() ||
  self.min_thickness.is_inf() ||
  self.min_thickness < 0.0 ||
  self.validation.triangle_count == 0 ||
  !self.validation.is_watertight() ||
  self.validation.degenerate_count > 0 ||
  self.validation.wrong_normal_count > 0 ||
  self.winding.flipped_faces > 0 ||
  self.inward() ||
  !self.winding.orientation_reliable() ||
  self.thin_wall() ||
  self.thickness_unavailable()
}

///|
pub fn PrintabilityReport::verdict(self : PrintabilityReport) -> String {
  if self.needs_review() {
    "本次网格检查发现需要复核的问题;不构成可打印结论。"
  } else {
    "本次网格检查未发现已覆盖的问题;不构成可打印结论,仍需确认单位、材料、设备和切片设置。"
  }
}

///|
pub fn review_scope() -> String {
  "工艺未评估:喷嘴、支撑、材料、摆放方向和切片参数;射线样本不保证全局最小壁厚。"
}