#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
#define GMN 6

// hold layer
#define KC_TAL1 LT(NUM, KC_TAB)
#define KC_BSL2 LT(SYM, KC_BSPC)
#define KC_ENL4 LT(MUL, KC_ENT)
#define KC_SPL3 LT(NAV, KC_SPC)

// toggle layer
#define KC_TG5 TG(FUN)
#define KC_TG6 TG(GMN)

// 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] = {

  // --- 0: BSE LAYER -------------------------------------------------------------------------------
  //
  //                 +-------+                                              +-------+
  //         +-------+       +-------+                              +-------+       +-------+
  //         |       |   E   |       +-------+              +-------+       |   I   |       |
  //         |   W   |       |   R   |       |              |       |   U   |       |   O   |
  // +-------+       +-------+       |   T   |              |   Y   |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |   Q   |       |   D   |       +-------+              +-------+       |   K   |       |   P   |
  // |       |   S   |       |   F   |       |              |       |   J   |       |   L   |       |
  // +-------+       +-------+       |   G   |              |   H   |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |   A   |       |   C   |       +-------+              +-------+       |  < ,  |       |  : ;  |
  // |       |   X   |       |   V   |       |              |       |   M   |       |  > .  |       |
  // +-------+       +-------+       |   B   |              |   N   |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |   Z   |                       +-------+              +-------+                       |  ? /  |
  // |       |                   +-------+                      +-------+                   |       |
  // +-------+                   |       +-------+      +-------+       |                   +-------+
  //                      +---   |  TAB  |       |      |       |  BSP  |   ---+
  //                      |      |       |  SPC  |      |  ENT  |       |      |
  //                  [HOLD]     +-------+       |      |       +-------+     [HOLD]
  //               NUM LAYER             +-------+      +-------+             SYM LAYER
  // 
  //                                         |              |
  //                                     [HOLD]            [HOLD]
  //                                  NAV LAYER            MUL LAYER

  [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
  ),

  // --- 1: NUM LAYER -------------------------------------------------------------------------------
  //
  //                 +-------+                                              +-------+
  //         +-------+       +-------+                              +-------+       +-------+
  //         |       |  ...  |       +-------+              +-------+       |   8   |       |
  //         |  ...  |       |  ...  |       |              |       |   7   |       |   9   |
  // +-------+       +-------+       |  ...  |              |   /   |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  ...  |       |  ...  |       +-------+              +-------+       |   5   |       |   +   |
  // |       |  ...  |       |  ...  |       |              |       |   4   |       |   6   |       |
  // +-------+       +-------+       |  ...  |              |   =   |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  ...  |       |  ...  |       +-------+              +-------+       |   2   |       |   -   |
  // |       |  ...  |       |  ...  |       |              |       |   1   |       |   3   |       |
  // +-------+       +-------+       |  ...  |              |   0   |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  ...  |                       +-------+              +-------+                       |   *   |
  // |       |                   +-------+                      +-------+                   |       |
  // +-------+                   |       +-------+      +-------+       |                   +-------+
  //                             |  ...  |       |      |       |  ...  |
  //                             |       |  ...  |      |  ...  |       |
  //                             +-------+       |      |       +-------+
  //                                     +-------+      +-------+

  [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
  ),

  // --- 2: SYM LAYER -------------------------------------------------------------------------------
  //
  //                 +-------+                                              +-------+
  //         +-------+       +-------+                              +-------+       +-------+
  //         |       |   (   |       +-------+              +-------+       |  ...  |       |
  //         |   !   |       |   )   |       |              |       |  ...  |       |  ...  |
  // +-------+       +-------+       |   @   |              |  ...  |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  ~ `  |       |   {   |       +-------+              +-------+       |  ...  |       |  ...  |
  // |       |   &   |       |   }   |       |              |       |  ...  |       |  ...  |       |
  // +-------+       +-------+       |  | \  |              |  ...  |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  " '  |       |   [   |       +-------+              +-------+       |  ...  |       |  ...  |
  // |       |   %   |       |   ]   |       |              |       |  ...  |       |  ...  |       |
  // +-------+       +-------+       |   #   |              |  ...  |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  _ -  |                       +-------+              +-------+                       |  ...  |
  // |       |                   +-------+                      +-------+                   |       |
  // +-------+                   |       +-------+      +-------+       |                   +-------+
  //                             |   ^   |       |      |       |  ...  |
  //                             |       |   $   |      |  ...  |       |
  //                             +-------+       |      |       +-------+
  //                                     +-------+      +-------+

  [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
  ),

  // --- 3: NAV LAYER -------------------------------------------------------------------------------
  //
  //                 +-------+                                              +-------+
  //         +-------+       +-------+                              +-------+       +-------+
  //         |       |  ...  |       +-------+              +-------+       |  NEX  |       |
  //         |  ...  |       |  ...  |       |              |       |  PRV  |       | VOLUP |
  // +-------+       +-------+       |  ...  |              |  MPY  |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  ...  |       |  ...  |       +-------+              +-------+       |  UP   |       | VOLDW |
  // |       |  ...  |       |  ...  |       |              |       |  DWN  |       |  RGT  |       |
  // +-------+       +-------+       |  ...  |              |  LFT  |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  ...  |       |  ...  |       +-------+              +-------+       |  PUP  |       |  INS  |
  // |       |  ...  |       |  ...  |       |              |       |  PDW  |       |  HOM  |       |
  // +-------+       +-------+       |  ...  |              |  PRT  |       +-------+       +-------+
  // |       +-------+       +-------+       |              |       +-------+       +-------+       |
  // |  ...  |                       +-------+              +-------+                       |  END  |
  // |       |                   +-------+                      +-------+                   |       |
  // +-------+                   |       +-------+      +-------+       |                   +-------+
  //                             |  ...  |       |      |       |  DEL  |
  //                             |       |  ...  |      |  ESC  |       |
  //                             +-------+       |      |       +-------+
  //                                     +-------+      +-------+

  [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
  ),

  // --- 4: MUL LAYER -------------------------------------------------------------------------------

  [MUL] = LAYOUT(
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TG5,       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TG6,       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
  ),

  // --- 5: FUN LAYER -------------------------------------------------------------------------------

  [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
  ),

  // --- 6: GMN LAYER -------------------------------------------------------------------------------

  [GMN] = LAYOUT(
    KC_ESC,  XXXXXXX, KC_W,    KC_E,    KC_G,         KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    KC_LSFT, KC_A,    KC_S,    KC_D,    KC_F,         KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    KC_Q,    XXXXXXX, KC_C,    XXXXXXX, XXXXXXX,      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                               KC_SPC,  KC_LCTL,      KC_TG6,  KC_TRNS
  ),

};
