/*
 * Model: Winter Guide Credit Card Ice Scraper
 * Model Name: winter_guide_credit_card_ice_scraper
 * Author: Senior 3D CAD & Parametric Modeling Specialist
 * Website: winter.guide
 * Standard: ISO/IEC 7810 ID-1 Form Factor
 * Invariants: 100% Watertight 2-Manifold, Zero Supports, Anti-Elephant's Foot Chamfer
 */

/* [Card Envelope] */
card_length = 85.60;          // ISO/IEC 7810 ID-1 length (mm)
card_width = 53.98;           // ISO/IEC 7810 ID-1 width (mm)
card_thickness = 2.40;       // Nominal card thickness (mm)
corner_radius = 3.18;        // Standard 1/8" card corner radius (mm)

/* [Scraping Chisel Blade] */
blade_bevel_angle = 45.0;    // Scraping chisel attack bevel (degrees)
blade_tip_thickness = 0.80;  // Blunt durable landing edge (mm)

/* [Ice Buster Corner Teeth] */
num_teeth = 4;               // Number of glaze-ice fracturing teeth
teeth_depth = 2.00;          // Inward tooth depth (mm)
teeth_pitch = 4.00;          // Tooth-to-tooth pitch spacing (mm)
teeth_start_y = 28.00;       // Starting Y position along left edge (mm)

/* [Lanyard & Keyring Hole] */
lanyard_hole_dia = 4.50;     // Hole diameter for keyring / paracord (mm)
lanyard_x = 77.10;           // Hole center X offset (mm)
lanyard_y = 8.50;            // Hole center Y offset (mm)

/* [Ergonomic Thumb Grip] */
thumb_x = 42.80;             // Thumb grip center X (mm)
thumb_y = 32.00;             // Thumb grip center Y (mm)
thumb_num_grooves = 5;       // Number of traction grooves
thumb_groove_pitch = 2.40;   // Spacing between grooves (mm)
thumb_groove_width = 1.00;   // Width of each traction groove (mm)
thumb_groove_length = 16.00; // Length of each traction groove (mm)
thumb_groove_depth = 0.50;   // Recessed depth into top face (mm)

/* [Branding & Text] */
branding_text = "winter.guide"; // Debossed branding text
text_size = 4.80;            // Text font size (mm)
text_depth = 0.60;           // Deboss depth (3 layers @ 0.20mm) (mm)
branding_x = 42.80;          // Branding center X (mm)
branding_y = 16.00;          // Branding center Y (mm)

/* [Print Compensation] */
base_chamfer = 0.40;         // Anti-elephant's foot bed chamfer (mm)

/* [Hidden] */
$fn = 64;
eps = 0.02;

// Render default model
winter_guide_credit_card_ice_scraper();

// Backward compatibility alias for emergency_ice_card test runners
module emergency_ice_card() {
    winter_guide_credit_card_ice_scraper();
}

module winter_guide_credit_card_ice_scraper() {
    difference() {
        card_base();
        scraper_blade_bevel();
        ice_breaker_teeth();
        lanyard_hole();
        thumb_traction_grooves();
        branding_deboss();
    }
}

// Solid base with anti-elephant's foot 45-degree chamfer
module card_base() {
    hull() {
        for (pos = [
            [corner_radius, corner_radius],
            [card_length - corner_radius, corner_radius],
            [card_length - corner_radius, card_width - corner_radius],
            [corner_radius, card_width - corner_radius]
        ]) {
            translate([pos[0], pos[1], 0]) {
                // Bottom bed chamfer (Z = 0 to base_chamfer)
                cylinder(r1 = corner_radius - base_chamfer, 
                         r2 = corner_radius, 
                         h = base_chamfer);
                // Upper vertical perimeter wall
                translate([0, 0, base_chamfer])
                    cylinder(r = corner_radius, 
                             h = card_thickness - base_chamfer);
            }
        }
    }
}

// 45-degree front chisel scraping bevel tapering down to 0.80mm
module scraper_blade_bevel() {
    bevel_height = card_thickness - blade_tip_thickness;
    bevel_run = bevel_height / tan(blade_bevel_angle);
    
    translate([-eps, card_width - bevel_run, blade_tip_thickness])
        rotate([-blade_bevel_angle, 0, 0])
        cube([card_length + 2 * eps, bevel_run * 3, card_thickness * 3]);
}

// Glaze-ice shattering diamond teeth along the left edge
module ice_breaker_teeth() {
    for (i = [0 : num_teeth - 1]) {
        y_pos = teeth_start_y + i * teeth_pitch;
        translate([-eps, y_pos, -eps])
            linear_extrude(height = card_thickness + 2 * eps)
                polygon([
                    [0, 0],
                    [teeth_depth + eps, teeth_pitch / 2],
                    [0, teeth_pitch]
                ]);
    }
}

// Chamfered 4.5mm keyring/lanyard hole
module lanyard_hole() {
    translate([lanyard_x, lanyard_y, -eps]) {
        // Central bore
        cylinder(d = lanyard_hole_dia, h = card_thickness + 2 * eps);
        // Top countersink / lead-in chamfer
        translate([0, 0, card_thickness - 0.60 + eps])
            cylinder(r1 = lanyard_hole_dia / 2, 
                     r2 = lanyard_hole_dia / 2 + 0.60, 
                     h = 0.60 + eps);
        // Bottom chamfer
        cylinder(r1 = lanyard_hole_dia / 2 + base_chamfer, 
                 r2 = lanyard_hole_dia / 2, 
                 h = base_chamfer + eps);
    }
}

// Recessed thumb grip traction grooves
module thumb_traction_grooves() {
    start_x = thumb_x - (thumb_num_grooves - 1) * thumb_groove_pitch / 2;
    for (i = [0 : thumb_num_grooves - 1]) {
        translate([start_x + i * thumb_groove_pitch, thumb_y, card_thickness - thumb_groove_depth])
            cube([thumb_groove_width, thumb_groove_length, thumb_groove_depth + eps], center = true);
    }
}

// Crisp debossed branding
module branding_deboss() {
    translate([branding_x, branding_y, card_thickness - text_depth])
        linear_extrude(height = text_depth + eps)
            text(branding_text, size = text_size, font = "Liberation Sans:style=Bold", 
                 halign = "center", valign = "center");
}
