#include QMK_KEYBOARD_H

// ################
// # Claw Sweeper #
// ################

// layers
#define BSE 0
#define NUM 1
#define SYM 2
#define NAV 3
#define MUL 4
#define FUN 5

// hold layer
#define KC_TAL1 LT(NUM, KC_TAB)
#define KC_BSL2 LT(SYM, KC_BSPC)
#define KC_ENL4 LT(4, KC_ENT)
#define KC_SPL3 LT(NAV, KC_SPC)

// toggle layer
#define KC_TG5 TG(5)

// home rows left
#define KC_CTA LCTL_T(KC_A)
#define KC_ALS LALT_T(KC_S)
#define KC_GUD LGUI_T(KC_D)
#define KC_SHF LSFT_T(KC_F)

// home rows right
#define KC_SHJ LSFT_T(KC_J)
#define KC_GUK LGUI_T(KC_K)
#define KC_ALL LALT_T(KC_L)
#define KC_CTSC LCTL_T(KC_SCLN)

// parentheses
#define KC_LBRR LSFT(KC_9)
#define KC_RBRR LSFT(KC_0)

// braces
#define KC_LBRS LSFT(KC_LBRC)
#define KC_RBRS LSFT(KC_RBRC)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [BSE] = LAYOUT(
    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,         KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,
    KC_CTA,  KC_ALS,  KC_GUD,  KC_SHF,  KC_G,         KC_H,    KC_SHJ,  KC_GUK,  KC_ALL,  KC_CTSC,
    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,         KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,
                               KC_TAL1, KC_SPL3,      KC_ENL4, KC_BSL2
  ),
  [NUM] = LAYOUT(
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,      KC_PSLS, KC_7,    KC_8,    KC_9,    KC_PPLS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,      KC_EQL,  KC_4,    KC_5,    KC_6,    KC_PMNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,      KC_0,    KC_1,    KC_2,    KC_3,    KC_PAST,
                               KC_TRNS, KC_TRNS,      KC_TRNS, KC_TRNS
  ),
  [SYM] = LAYOUT(
    KC_GRV,  KC_EXLM, KC_LBRR, KC_RBRR, KC_AT,        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    KC_QUOT, KC_AMPR, KC_LBRS, KC_RBRS, KC_BSLS,      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    KC_MINS, KC_PERC, KC_LBRC, KC_RBRC, KC_HASH,      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                               KC_CIRC, KC_DLR,       KC_TRNS, KC_TRNS
  ),
  [NAV] = LAYOUT(
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,      KC_MPLY, KC_MPRV, KC_MNXT, KC_VOLU, KC_VOLD,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,      KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, KC_INS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,      KC_PSCR, KC_PGDN, KC_PGUP, KC_HOME, KC_END,
                               KC_TRNS, KC_TRNS,      KC_ESC,  KC_DEL
  ),
  [MUL] = LAYOUT(
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TG5,       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                               XXXXXXX, XXXXXXX,      KC_TRNS, KC_TRNS
  ),
  [FUN] = LAYOUT(
    KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    KC_F11,  KC_F12,  XXXXXXX, XXXXXXX, XXXXXXX,      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                               KC_TRNS, KC_TRNS,      KC_TG5,  KC_TRNS
  ),
};
