///|
// Represents a B_SPLINE_SURFACE_WITH_KNOTS entity.
// In STEP Part 21 files this most commonly appears as a part of a complex
// instance together with B_SPLINE_SURFACE and (optionally) RATIONAL_B_SPLINE_SURFACE.
// Example (from MachineContactMedium.step):
//   B_SPLINE_SURFACE_WITH_KNOTS((3,3),(3,2,3),(-0.16,...),(-3.14,...),.UNSPECIFIED.)
//
// Notes:
// - We store knot values as raw strings to preserve STEP formatting.
pub struct BSplineSurfaceWithKnots {
  u_multiplicities : Array[Int32]
  v_multiplicities : Array[Int32]
  u_knots : Array[String]
  v_knots : Array[String]
  knot_spec : String
}

///|
pub fn BSplineSurfaceWithKnots::new(
  u_multiplicities : Array[Int32],
  v_multiplicities : Array[Int32],
  u_knots : Array[String],
  v_knots : Array[String],
  knot_spec : String,
) -> BSplineSurfaceWithKnots {
  BSplineSurfaceWithKnots::{
    u_multiplicities,
    v_multiplicities,
    u_knots,
    v_knots,
    knot_spec,
  }
}

///|
pub impl @step.Entity for BSplineSurfaceWithKnots with fn to_step(self) {
  let u_mults_str = self.u_multiplicities.map(fn(i) { "\{i}" }).join(",")
  let v_mults_str = self.v_multiplicities.map(fn(i) { "\{i}" }).join(",")
  let u_knots_str = self.u_knots.join(",")
  let v_knots_str = self.v_knots.join(",")
  "B_SPLINE_SURFACE_WITH_KNOTS((\{u_mults_str}),(\{v_mults_str}),(\{u_knots_str}),(\{v_knots_str}),\{self.knot_spec})"
}