import cadquery2 as cq
from cadquery2 import exporters

from parameters import *

screen_cutout = (
    cq.Sketch().trapezoid(screen_w, screen_l, 90, mode="a").reset().vertices().fillet(1)
)

board_cutout = (
    cq.Sketch().trapezoid(55, 50, 90, mode="a").reset().vertices("<X").fillet(5)
)

plug_channel_cutout = cq.Sketch().trapezoid(47, 7.5, 90, mode="a").reset().vertices("<X")

cable_relief = cq.Sketch().trapezoid(width - 2 * shell_t, 30, 90)

break_depth = 20
segment_breaks_top = (
    cq.Sketch()
    .rarray(1, length, 1, 1)
    .trapezoid(width / 3, break_depth, 110, mode="a")
    .reset()
    .vertices()
    .fillet(5)
)

segment_breaks_bottom = (
    cq.Sketch()
    .rarray(1, length, 1, 1)
    .trapezoid(width / 3, break_depth, 70, mode="a")
    .reset()
    .vertices()
    .fillet(5)
)

back_reinforcement = (
    cq.Sketch().trapezoid(width / 2, length-break_depth, 90, mode="a").reset().vertices().fillet(2)
)

threaded_inserts = cq.Sketch().rarray(width / 8, 0, 4, 1).circle(ti_radius, mode="a")


def case():
    # Case for the screen
    return (
        # Basic filleted box shape
        cq.Workplane("bottom")
        .lineTo(-width, 0)
        .lineTo(-width, height)
        .lineTo(0, height)
        .close()
        .extrude(length)
        .shell(-shell_t)
        .edges("|X")
        .fillet(fillet_s)
        # Cutout visible screen area from top face
        .faces(">Z")
        .workplane(centerOption="CenterOfBoundBox")
        .center((width - screen_w) / 2 - bezel_left, 0)
        .placeSketch(screen_cutout)
        .cutBlind(-shell_t)
        # Cutout for segment breaks
        .faces(">Z")
        .workplane(centerOption="CenterOfBoundBox")
        .center(0, length / 2)
        .placeSketch(segment_breaks_top)
        .cutBlind(-1000)
        .center(0, -length)
        .placeSketch(segment_breaks_bottom)
        .cutBlind(-1000)
        # Make some room for the ribbon cable
        .faces("<Z[-2]")
        .workplane(centerOption="CenterOfBoundBox")
        .placeSketch(cable_relief)
        .cutBlind(-1)
        # Back reinforcement with holes for threaded inserts
        .faces("<Z")
        .workplane(centerOption="CenterOfBoundBox")
        .placeSketch(back_reinforcement)
        .extrude(7 + ti_depth - shell_t)
        .faces("<Z")
        .workplane(centerOption="CenterOfBoundBox")
        .placeSketch(threaded_inserts)
        .cutBlind(-ti_depth)
        # Cutout room for plugs to slide in and be exposed
        .faces(">X")
        .workplane(centerOption="CenterOfBoundBox")
        .center(0, -5)
        .placeSketch(plug_channel_cutout)
        .cutBlind(-width / 2)
    )


full_case = case()
exporters.export(full_case, "case.stl")

top_case = case().faces(">X").workplane(offset=-width / 2).split(keepTop=True)
exporters.export(top_case, "case_1.stl")

bottom_case = case().faces(">X").workplane(offset=-width / 2).split(keepBottom=True)
exporters.export(bottom_case, "case_2.stl")
