// Lego Brick
// A standard Lego brick. This is a small, plastic construction block toy that can be interlocked with other blocks to build various structures, models, and figures. There are a lot of hacks used in this code.

// Set Units
@settings(defaultLengthUnit = in, kclVersion = 1.0)

// Define parameters
lbumps = 3 // number of bumps long
wbumps = 2 // number of bumps wide
pitch = 8.0
clearance = 0.1
bumpDiam = 4.8
bumpHeight = 1.8
height = 3.2
t = (pitch - (2 * clearance) - bumpDiam) / 2.0
postDiam = pitch - t // works out to 6.5
totalLength = lbumps * pitch - (2.0 * clearance)
totalWidth = wbumps * pitch - (2.0 * clearance)

// Calculate the number of segments in the length and width
lSegments = totalLength / lbumps
wSegments = totalWidth / wbumps

// Add assertions to ensure that the number of bumps are greater than 1
assert(lbumps, isGreaterThan = 1, error = "lbumps must be greater than 1")
assert(wbumps, isGreaterThan = 1, error = "wbumps must be greater than 1")

// Make the base
base = startSketchOn(XY)
  |> startProfile(at = [-totalWidth / 2, -totalLength / 2])
  |> line(end = [totalWidth, 0])
  |> line(end = [0, totalLength])
  |> line(end = [-totalWidth, 0])
  |> close()
  |> extrude(length = height)

// Sketch and extrude a rectangular shape to create the shell underneath the lego. Will replace with shell function when able to call a face created from shell.
shellExtrude = startSketchOn(base, face = START)
  |> startProfile(at = [
       -(totalWidth / 2 - t),
       -(totalLength / 2 - t)
     ])
  |> line(end = [totalWidth - (2 * t), 0])
  |> line(end = [0, totalLength - (2 * t)])
  |> line(end = [-(totalWidth - (2 * t)), 0])
  |> close()
  |> extrude(length = -(height - t))

// Create the pegs on the top of the base
peg = startSketchOn(base, face = END)
  |> circle(
       center = [
         -(pitch * (wbumps - 1) / 2),
         -(pitch * (lbumps - 1) / 2)
       ],
       radius = bumpDiam / 2,
     )
  |> patternLinear2d(axis = [1, 0], instances = wbumps, distance = pitch)
  |> patternLinear2d(axis = [0, 1], instances = lbumps, distance = pitch)
  |> extrude(length = bumpHeight)

// Create the pegs on the bottom of the base
tubePattern = startSketchOn(shellExtrude, face = START)
  |> circle(
       center = [
         -(pitch * (wbumps - 1) / 2 - (pitch / 2)),
         -(pitch * (lbumps - 1) / 2 - (pitch / 2))
       ],
       radius = bumpDiam / 2,
     )
  |> patternLinear2d(axis = [1, 0], instances = wbumps - 1, distance = pitch)
  |> patternLinear2d(axis = [0, 1], instances = lbumps - 1, distance = pitch)
  |> extrude(length = bumpHeight)
