// Food Service Spatula
// Use these spatulas for mixing, flipping, and scraping.

// Set units
@settings(defaultLengthUnit = mm, kclVersion = 1.0)

// Define parameters
flipperThickness = 3.5
flipperLength = 70.0
handleWidth = 15.0
gripLength = 150.0
flipperFilletRadius = 5.0
flipperSlotWidth = 10.0
gripWidth = 10.0
gripHeight = 20.0
gripFilletRadius = 3.0
gripSlotWidth = 8.0

// Function for drawing slots on a sketch given the start and end points as well as a width
fn slot(sketch1, start, end, width) {
  angle = if start[0] == end[0] {
    if end[1] > start[1] {
      90
    } else {
      270
    }
  } else {
    if end[0] < start[0] {
      units::toDegrees(atan((end[1] - start[1]) / (end[0] - start[0]))) + 180
    } else {
      units::toDegrees(atan((end[1] - start[1]) / (end[0] - start[0])))
    }
  }
  dist = sqrt(pow(end[1] - start[1], exp = 2) + pow(end[0] - start[0], exp = 2))
  xstart = width / 2 * cos(angle - 90) + start[0]
  ystart = width / 2 * sin(angle - 90) + start[1]
  slotSketch = startProfile(sketch1, at = [xstart, ystart])
    |> angledLine(angle = angle, length = dist)
    |> tangentialArc(radius = width / 2, angle = 180)
    |> angledLine(angle = angle, length = -dist)
    |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)])
    |> close()
  return slotSketch
}

// Create a sketch on the XY plane for the flipper
flipperSketch = startSketchOn(XY)

// Create a profile of the flipper
flipperProfile = startProfile(flipperSketch, at = [-flipperLength, -32.0])
  |> line(end = [flipperLength, 2.0])
  |> yLine(length = 60.0, tag = $backEdge)
  |> line(end = [-flipperLength, 2.0])
  |> arc(angleStart = 163.087610, angleEnd = 196.912390, radius = 110.0)
  |> close()

// Create a profile of the middle
slotProfile000 = slot(
  sketch1 = flipperSketch,
  start = [-25, 0],
  end = [-55, 0],
  width = flipperSlotWidth,
)

// Create a profile of the top slot
slotProfile001 = slot(
  sketch1 = flipperSketch,
  start = [-25, 18],
  end = [-55, 19],
  width = flipperSlotWidth,
)

// Create a profile of the bottom slot
slotProfile002 = slot(
  sketch1 = flipperSketch,
  start = [-25, -18],
  end = [-55, -19],
  width = flipperSlotWidth,
)

// Create a profile with slots for the spatula
spatulaProfile = flipperProfile
  |> subtract2d(tool = slotProfile000)
  |> subtract2d(tool = slotProfile001)
  |> subtract2d(tool = slotProfile002)

// Extrude the profile to create the spatula flipper
flipper = extrude(spatulaProfile, length = flipperThickness)

// Fillet the edges of the flipper
fillet(
  flipper,
  radius = flipperFilletRadius,
  tags = [
    getNextAdjacentEdge(backEdge),
    getPreviousAdjacentEdge(backEdge)
  ],
)

// Create a sketch on the XZ plane offset by half the thickness
handleSketch = startSketchOn(offsetPlane(XZ, offset = -handleWidth / 2))

// Create a profile of the spatula handle
handleProfile = startProfile(handleSketch, at = [0.0, flipperThickness])
  |> line(end = [31.819805, 31.819805], tag = $handleBottomEdge)
  |> line(end = [140.953893, 51.303021])
  |> line(end = [-1.710101, 4.698463])
  |> line(end = [-141.995517, -51.682142], tag = $handleTopEdge)
  |> line(end = [-36.139148, -36.139148])
  |> xLine(length = 7.071068)
  |> close()

// Create an extrusion
handle = extrude(handleProfile, length = handleWidth)

// Fillet the bend of the spatula handle
fillet(
  handle,
  radius = 4,
  tags = [
    getNextAdjacentEdge(handleBottomEdge),
    getNextAdjacentEdge(handleTopEdge)
  ],
)

// Define a plane which is at the end of the handle
handlePlane = {
  origin = [208.593833, 0.0, 75.921946],
  xAxis = [0.342020, -0.0, -0.939693],
  yAxis = [0.0, 1.0, 0.0],
  zAxis = [0.939693, -0.0, 0.342020]
}

// Create a sketch on the handle plane
gripSketch = startSketchOn(handlePlane)

// Create a profile of the grip
gripProfile = startProfile(gripSketch, at = [-26.806746, -10.0])
  |> xLine(length = gripWidth - (2 * gripFilletRadius))
  |> arc(angleStart = -90.0, angleEnd = 0.0, radius = gripFilletRadius)
  |> yLine(length = gripHeight - (2 * gripFilletRadius))
  |> arc(angleStart = 0.0, angleEnd = 90.0, radius = gripFilletRadius)
  |> xLine(length = -(gripWidth - (2 * gripFilletRadius)))
  |> arc(angleStart = 90.0, angleEnd = 180.0, radius = gripFilletRadius)
  |> yLine(length = -(gripHeight - (2 * gripFilletRadius)), tag = $gripEdgeTop)
  |> arc(angleStart = 180.0, angleEnd = 270.0, radius = gripFilletRadius)
  |> close()

// Extrude the grip profile to create the grip
grip = extrude(gripProfile, length = -gripLength)

// Create a sketch on the grip for the hole
holeSketch = startSketchOn(grip, face = gripEdgeTop)

// Create a profile for the grip hole
gripHoleProfile = slot(
  sketch1 = holeSketch,
  start = [0, 200],
  end = [0, 210],
  width = gripSlotWidth,
)

// Cut a hole in the grip
extrude(gripHoleProfile, length = -gripWidth - 20)
