import argparse
from dxfwrite import DXFEngine as dxf

parser = argparse.ArgumentParser(
        description='Generate foldable boxes. Exports in .dxf format')
parser.add_argument('length', metavar='l', type=float,
        help="inner length of box")
parser.add_argument('width', metavar='w', type=float,
        help="inner width of box")
parser.add_argument('height', metavar='h', type=float,
        help="inner height of box")
parser.add_argument('thickness', metavar='t', type=float,
        help="thickness of material")
parser.add_argument('output', metavar='o', type=str,
        help="output .dxf file")
parser.add_argument('--lid', help="generate a lid")
args = parser.parse_args()

LENGTH = args.length
WIDTH = args.width
HEIGHT = args.height
THICKNESS = args.thickness

def add_line(start, end, c):
    drawing.add(dxf.line(start, end, color=c, layer='LINES'))

drawing = dxf.drawing(args.output)
drawing.add_layer('LINES')

BLACK = 3
RED = 1

# bottom box
add_line((THICKNESS,0), (LENGTH-THICKNESS,0), RED)
add_line((0,0), (0,WIDTH), RED)
add_line((LENGTH,0), (LENGTH,WIDTH), RED)
add_line((THICKNESS,WIDTH), (LENGTH-THICKNESS,WIDTH), RED)

add_line((THICKNESS,WIDTH/3), (THICKNESS*2,WIDTH/3), BLACK)
add_line((THICKNESS*2,WIDTH/3), (THICKNESS*2,WIDTH/3*2), BLACK)
add_line((THICKNESS*2,WIDTH/3*2), (THICKNESS,WIDTH/3*2), BLACK)
add_line((THICKNESS,WIDTH/3*2), (THICKNESS,WIDTH/3), BLACK)

add_line((LENGTH-THICKNESS,WIDTH/3), (LENGTH-THICKNESS*2,WIDTH/3), BLACK)
add_line((LENGTH-THICKNESS*2,WIDTH/3), (LENGTH-THICKNESS*2,WIDTH/3*2), BLACK)
add_line((LENGTH-THICKNESS*2,WIDTH/3*2), (LENGTH-THICKNESS,WIDTH/3*2), BLACK)
add_line((LENGTH-THICKNESS,WIDTH/3*2), (LENGTH-THICKNESS,WIDTH/3), BLACK)

# left side
add_line((THICKNESS,0), (-HEIGHT,0), BLACK)
add_line((-HEIGHT,0), (-HEIGHT, WIDTH), RED)
add_line((-HEIGHT,WIDTH), (THICKNESS,WIDTH), BLACK)

add_line((-HEIGHT,0), (-HEIGHT-THICKNESS,0), BLACK)
add_line((-HEIGHT-THICKNESS,0), (-HEIGHT-THICKNESS, WIDTH), RED)
add_line((-HEIGHT-THICKNESS,WIDTH), (-HEIGHT,WIDTH), BLACK)

x = -HEIGHT-THICKNESS
add_line((x,0), (x-HEIGHT/3,0), BLACK)
add_line((x-HEIGHT/3,0), (x-HEIGHT/3,-THICKNESS), BLACK)
add_line((x-HEIGHT/3,-THICKNESS), (x-HEIGHT/3*2,-THICKNESS), BLACK)
add_line((x-HEIGHT/3*2,-THICKNESS), (x-HEIGHT/3*2,0), BLACK)
add_line((x-HEIGHT/3*2,0), (x-HEIGHT,0), BLACK)
add_line((x-HEIGHT,0), (x-HEIGHT,WIDTH/3), BLACK)
add_line((x-HEIGHT,WIDTH/3), (x-HEIGHT-THICKNESS,WIDTH/3), BLACK)
add_line((x-HEIGHT-THICKNESS,WIDTH/3), (x-HEIGHT-THICKNESS,WIDTH/3*2), BLACK)
add_line((x-HEIGHT-THICKNESS,WIDTH/3*2), (x-HEIGHT,WIDTH/3*2), BLACK)
add_line((x-HEIGHT,WIDTH/3*2), (x-HEIGHT,WIDTH), BLACK)
add_line((x-HEIGHT,WIDTH), (x-HEIGHT/3*2,WIDTH), BLACK)
add_line((x-HEIGHT/3*2,WIDTH), (x-HEIGHT/3*2,WIDTH+THICKNESS), BLACK)
add_line((x-HEIGHT/3*2,WIDTH+THICKNESS), (x-HEIGHT/3,WIDTH+THICKNESS), BLACK)
add_line((x-HEIGHT/3,WIDTH+THICKNESS), (x-HEIGHT/3,WIDTH), BLACK)
add_line((x-HEIGHT/3,WIDTH), (x,WIDTH), BLACK)

# right side
add_line((LENGTH-THICKNESS,0), (LENGTH+HEIGHT,0), BLACK)
add_line((LENGTH+HEIGHT,0), (LENGTH+HEIGHT, WIDTH), RED)
add_line((LENGTH+HEIGHT, WIDTH), (LENGTH-THICKNESS,WIDTH), BLACK)

add_line((LENGTH+HEIGHT,0), (LENGTH+HEIGHT+THICKNESS,0), BLACK)
add_line((LENGTH+HEIGHT+THICKNESS,0), (LENGTH+HEIGHT+THICKNESS, WIDTH), RED)
add_line((LENGTH+HEIGHT+THICKNESS,WIDTH), (LENGTH+HEIGHT,WIDTH), BLACK)

x = LENGTH+HEIGHT+THICKNESS
add_line((x,0), (x+HEIGHT/3,0), BLACK)
add_line((x+HEIGHT/3,0), (x+HEIGHT/3,-THICKNESS), BLACK)
add_line((x+HEIGHT/3,-THICKNESS), (x+HEIGHT/3*2,-THICKNESS), BLACK)
add_line((x+HEIGHT/3*2,-THICKNESS), (x+HEIGHT/3*2,0), BLACK)
add_line((x+HEIGHT/3*2,0), (x+HEIGHT,0), BLACK)
add_line((x+HEIGHT,0), (x+HEIGHT,WIDTH/3), BLACK)
add_line((x+HEIGHT,WIDTH/3), (x+HEIGHT+THICKNESS,WIDTH/3), BLACK)
add_line((x+HEIGHT+THICKNESS,WIDTH/3), (x+HEIGHT+THICKNESS,WIDTH/3*2), BLACK)
add_line((x+HEIGHT+THICKNESS,WIDTH/3*2), (x+HEIGHT,WIDTH/3*2), BLACK)
add_line((x+HEIGHT,WIDTH/3*2), (x+HEIGHT,WIDTH), BLACK)
add_line((x+HEIGHT,WIDTH), (x+HEIGHT/3*2,WIDTH), BLACK)
add_line((x+HEIGHT/3*2,WIDTH), (x+HEIGHT/3*2,WIDTH+THICKNESS), BLACK)
add_line((x+HEIGHT/3*2,WIDTH+THICKNESS), (x+HEIGHT/3,WIDTH+THICKNESS), BLACK)
add_line((x+HEIGHT/3,WIDTH+THICKNESS), (x+HEIGHT/3,WIDTH), BLACK)
add_line((x+HEIGHT/3,WIDTH), (x,WIDTH), BLACK)

# back side
add_line((THICKNESS,0), (THICKNESS,HEIGHT/-3), RED)
add_line((THICKNESS,HEIGHT/-3), (THICKNESS,HEIGHT/-3*2), BLACK)
add_line((THICKNESS,HEIGHT/-3*2), (THICKNESS,-HEIGHT), RED)
add_line((THICKNESS,-HEIGHT), (LENGTH-THICKNESS,-HEIGHT), BLACK)
add_line((LENGTH-THICKNESS,-HEIGHT), (LENGTH-THICKNESS,HEIGHT/-3*2), RED)
add_line((LENGTH-THICKNESS,HEIGHT/-3*2), (LENGTH-THICKNESS,HEIGHT/-3), BLACK)
add_line((LENGTH-THICKNESS,HEIGHT/-3), (LENGTH-THICKNESS,0), RED)

add_line((THICKNESS,-HEIGHT/3), (THICKNESS*2,-HEIGHT/3), BLACK)
add_line((THICKNESS*2,-HEIGHT/3), (THICKNESS*2,-HEIGHT/3*2), BLACK)
add_line((THICKNESS*2,-HEIGHT/3*2), (THICKNESS,-HEIGHT/3*2), BLACK)

add_line((WIDTH/-2+THICKNESS,0), (WIDTH/-2+THICKNESS,-HEIGHT), BLACK)
add_line((WIDTH/-2+THICKNESS,-HEIGHT), (THICKNESS,-HEIGHT), BLACK)

add_line((LENGTH-THICKNESS,-HEIGHT/3), (LENGTH-THICKNESS*2,-HEIGHT/3), BLACK)
add_line((LENGTH-THICKNESS*2,-HEIGHT/3), (LENGTH-THICKNESS*2,-HEIGHT/3*2), BLACK)
add_line((LENGTH-THICKNESS*2,-HEIGHT/3*2), (LENGTH-THICKNESS,-HEIGHT/3*2), BLACK)

add_line((LENGTH+WIDTH/2-THICKNESS,0), (LENGTH+WIDTH/2-THICKNESS,-HEIGHT), BLACK)
add_line((LENGTH+WIDTH/2-THICKNESS,-HEIGHT), (LENGTH-THICKNESS,-HEIGHT), BLACK)

# front side
add_line((THICKNESS,WIDTH), (THICKNESS,WIDTH+HEIGHT/3), RED)
add_line((THICKNESS,WIDTH), (THICKNESS,WIDTH+HEIGHT/3*2), BLACK)
add_line((THICKNESS,WIDTH), (THICKNESS,WIDTH+HEIGHT), RED)
add_line((THICKNESS,WIDTH+HEIGHT), (LENGTH-THICKNESS,WIDTH+HEIGHT), BLACK)
add_line((LENGTH-THICKNESS,WIDTH+HEIGHT), (LENGTH-THICKNESS,WIDTH+HEIGHT/3*2), RED)
add_line((LENGTH-THICKNESS,WIDTH+HEIGHT/3*2), (LENGTH-THICKNESS,WIDTH+HEIGHT/3), BLACK)
add_line((LENGTH-THICKNESS,WIDTH+HEIGHT/3), (LENGTH-THICKNESS,WIDTH), RED)

add_line((THICKNESS,WIDTH+HEIGHT/3), (THICKNESS*2,WIDTH+HEIGHT/3), BLACK)
add_line((THICKNESS*2,WIDTH+HEIGHT/3), (THICKNESS*2,WIDTH+HEIGHT/3*2), BLACK)
add_line((THICKNESS*2,WIDTH+HEIGHT/3*2), (THICKNESS,WIDTH+HEIGHT/3*2), BLACK)

add_line((WIDTH/-2+THICKNESS,WIDTH), (WIDTH/-2+THICKNESS,WIDTH+HEIGHT), BLACK)
add_line((WIDTH/-2+THICKNESS,WIDTH+HEIGHT), (THICKNESS,WIDTH+HEIGHT), BLACK)

add_line((LENGTH-THICKNESS,WIDTH+HEIGHT/3), (LENGTH-THICKNESS*2,WIDTH+HEIGHT/3), BLACK)
add_line((LENGTH-THICKNESS*2,WIDTH+HEIGHT/3), (LENGTH-THICKNESS*2,WIDTH+HEIGHT/3*2), BLACK)
add_line((LENGTH-THICKNESS*2,WIDTH+HEIGHT/3*2), (LENGTH-THICKNESS,WIDTH+HEIGHT/3*2), BLACK)

add_line((LENGTH+WIDTH/2-THICKNESS,WIDTH), (LENGTH+WIDTH/2-THICKNESS,WIDTH+HEIGHT), BLACK)
add_line((LENGTH+WIDTH/2-THICKNESS,WIDTH+HEIGHT), (LENGTH-THICKNESS,WIDTH+HEIGHT), BLACK)

drawing.save()
