include <./common/common.scad>;
include <./common/threads.scad>;

Core16mm = 25.5;
Socket16mmH = 11;
PlatterThickness = 1.6;
Platter120m = 178;
Thread16mmD = 17.5;
Pitch16mm = 1.525;

SocketSuper8H = 4;
ThreadSuper8D = 21;

module rotary_text (TextArr = ["T","e","s","t"], D = 40, CharacterAngle = 15) {
    Radius = R(D);
    Chars = len(TextArr);
    for (i = [0:1:Chars]) {
        rotate([0, 0, -i * CharacterAngle]) translate([0, Radius, 0]) {
            scale([0.5, 0.5, 1]) linear_extrude(height = 1) {
                text(TextArr[i], halign = "center");
            }
        }
    }
}

module thread_16mm ( pos = [0, 0, 0], length = 11, chamfer = false, pad = 0) {
    translate(pos) {
        if (chamfer) {
            metric_thread (diameter=Thread16mmD + pad, pitch=Pitch16mm, length=length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=2, leadfac=1.5);
        } else {
            metric_thread (diameter=Thread16mmD + pad, pitch=Pitch16mm, length=length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=0, leadfac=1.5);
        }
    }
}

module thread_super8 ( pos = [0, 0, 0], length = 6, chamfer = false, pad = 0) {
    translate(pos) {
        if (chamfer) {
            metric_thread (diameter=ThreadSuper8D + pad, pitch=Pitch16mm, length=length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=2, leadfac=1.5);
        } else {
            metric_thread (diameter=ThreadSuper8D + pad, pitch=Pitch16mm, length=length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=0, leadfac=1.5);
        }
    }
}

module threaded_core (pos = [0, 0, 0], format = "16mm") {
    $fn = 120;
    translate (pos) {
        if (format == "16mm") {
            union () {
                cylinder(r = R(Core16mm), h = 6, center = true);
                thread_16mm([0, 0, 1.5], length = Socket16mmH + 3, chamfer = true, pad = -0.2);
            }  
        } else if (format == "super8") {
            union () {
                cylinder(r = R(Core16mm), h = 4, center = true);
                thread_super8([0, 0, 0], length = SocketSuper8H + 3, chamfer = true, pad = -0.2);
            }  
        }
    }
}

module socket_core (pos = [0, 0, 0], format = "16mm") {
    $fn = 120;
    translate (pos) {
        if (format == "16mm") {
            difference () {
                cylinder(r = R(Core16mm), h = Socket16mmH, center = true);
            }
        } else if (format == "super8") {
            difference () {
                cylinder(r = R(Core16mm), h = SocketSuper8H, center = true);
            }
        }
    }
}

module platter (pos = [0, 0, 0], length = 120) {
    if (length == 120) {
        difference () {
            cylinder(r = R(Platter120m), h = PlatterThickness, center = true, $fn = 300);
            for (i = [0 : 3]) {
                rotate([0, 0, i * 90]) translate([105 / 2, 0, 0]) cylinder(r = R(44.5), h = PlatterThickness + 1, center = true, $fn = 100);
            }
        }
    }
}

module split_reel_16mm_A (length = 120) { 
    difference () {
        union () {
            difference () {
                platter([0, 0, 0], length = length);
                translate([0, 0, -0.5]) rotate([180, 0, 0]) rotate([0, 0, (5 * 3.75) / 2]) rotary_text(["1", "6", "m", "m", " ", " ", "1", "2", "0", "m", "/", "4", "0", "0", "f", "t"],  D = Platter120m - 15, CharacterAngle=3.75);
            }
            threaded_core([0, 0, (PlatterThickness / 2) + (6 / 2)], format = "16mm");
            rotate([0, 0, 135]) translate([18.5, 0, (PlatterThickness / 2) + (4.75 / 2)]) cylinder(r = R(6.25), h = 4.75, center = true, $fn = 60);
            
        }
        cube([8.5, 8.5, 50], center = true);
        rotate([0, 0, 45]) translate([5.5, 0, 0]) cube([3, 3, 50], center = true);
    }
}

module split_reel_16mm_B ( length = 120) {
    difference () {
        union () {
            platter([0, 0, 0], length = length);
            socket_core([0, 0, (PlatterThickness / 2) + (Socket16mmH / 2)], format = "16mm");
        }
        rotate([180, 0, 0]) scale([1.02, 1.02, 1]) {
            thread_16mm([0, 0, -13], 15);
            thread_16mm([0, 0, -13.1], 15);
        }
    }
}

module split_reel_super8_A ( length = 120) { 
    BaseH = 4;
    NotchH = 2;
    NotchW = 21;
    
    difference () {
        union () {
            difference () {
                platter([0, 0, 0], length = length);
                translate([0, 0, -0.5]) rotate([180, 0, 0]) rotate([0, 0, (5 * 3.75) / 2]) rotary_text(["S", "u", "p", "e", "r", "8", " ", " ", "1", "2", "0", "m", "/", "4", "0", "0", "f", "t"],  D = Platter120m - 15, CharacterAngle=3.75);
            }
            threaded_core([0, 0, (PlatterThickness / 2) + (BaseH / 2)], format = "super8");
            rotate([0, 0, 135]) translate([18.5, 0, (PlatterThickness / 2) + (NotchH / 2)]) cylinder(r = R(6.25), h = NotchH, center = true, $fn = 60);
        }
        cylinder(r = R(13), h = 50, center = true, $fn = 80);
        for (i = [0 : 2]) {
            rotate([0, 0, i * (360 / 3)]) translate([NotchW / 4, 0, 0]) cube([NotchW / 2, 2.25, 8], center = true);
        }
    }
}

module split_reel_super8_B ( length = 120) {
    difference () {
        union () {
            platter([0, 0, 0], length = length);
            socket_core([0, 0, (PlatterThickness / 2) + (SocketSuper8H / 2)], format = "super8");
        }
        rotate([180, 0, 0]) scale([1.02, 1.02, 1]) {
            thread_super8([0, 0, -13], 15);
            thread_super8([0, 0, -13.1], 15);
        }
    }
}

//length in meters
module split_reel (format = "16mm", length = 120, half = "A") {
    if (format == "16mm") {
        if (half == "A") {
            split_reel_16mm_A(length = length);
        } else if (half == "B") {
            split_reel_16mm_B(length = length);
        }
    } else if (format == "super8") {
        if (half == "A") {
            split_reel_super8_A(length = length);
        } else if (half == "B") {
            split_reel_super8_B(length = length);
        }
    }
}

module buildPyramidalExtrude(height,maxOffset,nSlices){
    heightIncrement = height / nSlices;
    offsetIncrement = maxOffset / (nSlices-1);
    for (i = [1 : nSlices]) {
        linear_extrude(height=i * heightIncrement) {
            offset(r = maxOffset - (i - 1) * offsetIncrement) {
                children();
            }
        }
    }
}

module logo_test () {
    difference () {
        split_reel("16mm", 120, "B");
        translate([-45, -48, -0.65]) scale([0.25, 0.25, 1]) { 
            rotate([180, 0, 0]) buildPyramidalExtrude(.5, .25, 20) {
                import(file = "svg/logo.svg", center = true);
            }
        }
    }
}

PART = "16mm_120m_B";

if (PART == "16mm_120m_A") {
    split_reel("16mm", 120, "A");
} else if (PART == "16mm_120m_B") {
    split_reel("16mm", 120, "B");
} else if (PART == "super8_120m_A") {
    split_reel("super8", 120, "A");
} else if (PART == "super8_120m_B") {
    split_reel("super8", 120, "B");
}
