import uuid
import enum

_footprint = """
(footprint "{name}" (version 20221018) (generator kicad_footprint)
  (layer "F.Cu")
  (attr smd)
  (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS")
      (effects (font (size 1 1) (thickness 0.1)))
    (tstamp {uuid_reference})
  )
  (fp_text value "{value}" (at 0 1 unlocked) (layer "F.Fab")
      (effects (font (size 1 1) (thickness 0.15)))
    (tstamp {uuid_value})
  )
  (fp_text user "${{REFERENCE}}" (at 0 2.5 unlocked) (layer "F.Fab")
      (effects (font (size 1 1) (thickness 0.15)))
    (tstamp {uuid_user})
  )
  {pads}
)
""".strip('\n')

def footprint(name, value, pads):
    return _footprint.format(
        name=name,
        value=value,
        uuid_reference=uuid.uuid4(),
        uuid_value=uuid.uuid4(),
        uuid_user=uuid.uuid4(),
        pads=pads,
    )

_pad = """
  (pad "{number}" smd rect (at {x} {y}) (size {w} {h}) (layers "{cu}" "{paste}" "{mask}")
    (thermal_bridge_angle 45) (tstamp {uuid}))
""".strip('\n')

class side(enum.Enum):
    front=enum.auto()
    back=enum.auto()

def pad(number, x, y, w, h, s):
    s = "F" if s is side.front else "B"
    cu = f"{s}.Cu"
    paste = f"{s}.Paste"
    mask = f"{s}.Mask"
    return _pad.format(
        number=number,
        x=x,
        y=y,
        w=w,
        h=h,
        cu=cu,
        paste=paste,
        mask=mask,
        uuid=uuid.uuid4()
    )

_fp_line = """
(fp_line (start {x0} {y0}) (end {x1} {y1})
    (stroke (width {width}) (type solid)) (layer "{layer}") (tstamp {uuid}))
"""

def fp_line(x0, y0, x1, y1, width, layer):
    return _fp_line.format(
        x0=x0,
        y0=y0,
        x1=x1,
        y1=y1,
        width=width,
        layer=layer,
        uuid=uuid.uuid4()
    )
