#include QMK_KEYBOARD_H
#include "version.h"

#ifndef KEYMAP_HP_SVORAK
#define KEYMAP_HP_SVORAK

// Define new symbols based on the Finnish standard layout. Most of this is
// taken from keymap_nordic.h.
//
// Some defined characters are unused as they are substituted with more timing
// sensitive versions in process_record_user(). This is needed for good
// performance on Macs when modifiers are involved.

// Normal characters
#define NO_SECT KC_GRV  // §
#define NO_PLUS KC_MINS // +
#define NO_DACT KC_EQL  // dead acute

#define NO_AM     KC_LBRC // Å
#define NO_DDIA   KC_RBRC // dead diaeresis
#define NO_OE     KC_SCLN // Ö
#define NO_AE     KC_QUOT // Ä
#define	NO_APOS	  KC_NUHS // '
#define NO_ESZETT ALGR(KC_S) // ß

#define NO_LESS	KC_NUBS // <
#define NO_MINS KC_SLSH // -

// Shifted characters
#define NO_HALF LSFT(NO_SECT) // ½
#define NO_QUOT	LSFT(KC_2)    // "
#define NO_HASH LSFT(KC_3)    // #
#define NO_BULT LSFT(KC_4)    // ¤
#define NO_AMPR	LSFT(KC_6)    // &
#define NO_SLSH LSFT(KC_7)    // /
#define NO_LPRN	LSFT(KC_8)    // (
#define NO_RPRN	LSFT(KC_9)    // )
#define NO_EQL	LSFT(KC_0)    // =
#define NO_QUES	LSFT(NO_PLUS) // ?
#define NO_GRV	LSFT(NO_DACT) // dead grave
#define NO_CIRC LSFT(NO_DDIA) // dead circumflex

#define NO_GRTR	LSFT(NO_LESS) // >
#define NO_SCLN LSFT(KC_COMM) // ;
#define NO_COLN LSFT(KC_DOT)  // :
#define NO_UNDS LSFT(NO_MINS) // _
#define NO_ASTR LSFT(KC_BSLS)  // *

// Alt Gr-ed characters
#define NO_AT   ALGR(KC_2)     // @
#define NO_PND	ALGR(KC_3)     // £
#define NO_DLR	ALGR(KC_4)     // $
#define NO_LCBR ALGR(KC_7)     // {
#define NO_LBRC ALGR(KC_8)     // [
#define NO_RBRC ALGR(KC_9)     // ]
#define NO_RCBR	ALGR(KC_0)     // }
#define NO_PIPE ALGR(KC_NUBS)  // |
#define NO_BSLS ALGR(KC_MINS)  // backslash
#define NO_TILD ALGR(NO_DDIA)  // dead tilde
#define NO_EURO ALGR(KC_E)     // €
#define NO_MU 	ALGR(KC_M)     // μ
#endif

enum custom_keycodes {
  PLACEHOLDER = SAFE_RANGE, // can always be here
  RGB_SLD,
  OM_QUOT,
  OM_HASH,
  OM_AMPR,
  OM_SLSH,
  OM_LPRN,
  OM_RPRN,
  OM_EQL,
  OM_QUES,
  OM_DGRAV,
  OM_DCIRC,
  OM_GRTR,
  OM_SCLN,
  OM_COLN,
  OM_UNDS,
  OM_ASTR,
  OM_AT,
  OM_PND,
  OM_DLR,
  OM_LCBR,
  OM_LBRC,
  OM_RBRC,
  OM_RCBR,
  OM_PIPE,
  OM_BSLS,
  OM_DTILD,
  OM_EURO,
  OM_DQUOT,
  OM_ESZETT,
  OM_TILD,
  OM_CIRC,
  OM_GRAV
};

// https://docs.qmk.fm/#/keycodes
// KC_TRANSPARENT = see through layer
// KC_NO          = do nothing
//
// LCTL_T(KC_A)  = left control when pressed, KC_A when tapped

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * | Esc    |   1  |   2  |   3  |   4  |   5  |  L4  |           |      |   6  |   7  |   8  |   9  |   0  | BackSp |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Tab    |   ,  |   Ä  |   Ö  |   P  |   Y  |  L3  |           |  L1  |   F  |   G  |   C  |   R  |   L  | Enter  |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LCtrl  |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |   S  |   -    |
 * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
 * | LShift |   .  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |   Z  | RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   | DOWN |  UP  | LAlt |AltSft| Win  |                                       | AltGR| RCtrl|      | LEFT | RIGHT  |
 *   `----------------------------------'                                       `------------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      | R_S  |       | Del  |  Ins |
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      | Home |       | PgUp |        |      |
 *                                 | Space|Backsp|------|       |------| Space  |  M1  |
 *                                 |      |ace   | End  |       | PgDn |        |      |
 *                                 `--------------------'       `----------------------'
 */
[0] = LAYOUT_ergodox(
  // left hand
  KC_ESCAPE,      KC_1,           KC_2,           KC_3,           KC_4,           KC_5,           TG(4),
  KC_TAB,         KC_COMMA,       NO_AE,          NO_OE,          KC_P,           KC_Y,           TG(3),
  KC_LCTL,        KC_A,           KC_O,           KC_E,           KC_U,           KC_I,
  KC_LSFT,        KC_DOT,         KC_Q,           KC_J,           KC_K,           KC_X,           KC_HYPR,

  KC_DOWN,        KC_UP,          LALT(KC_NO),    LALT(KC_LSFT),  KC_LGUI,

                                  KC_NO,          DM_RSTP,
                                                  KC_HOME,
                  KC_SPACE,       KC_BSPC,        KC_END,

  // right hand
  KC_NO,          KC_6,           KC_7,           KC_8,           KC_9,           KC_0,           KC_BSPC,
  TG(1),          KC_F,           KC_G,           KC_C,           KC_R,           KC_L,           KC_ENTER,
                  KC_D,           KC_H,           KC_T,           KC_N,           KC_S,           NO_MINS,
  KC_MEH,         KC_B,           KC_M,           KC_W,           KC_V,           KC_Z,           KC_RSFT,

                                  KC_RALT,        KC_RCTL,        KC_NO,          KC_LEFT,        KC_RIGHT,

                  KC_DELETE,      KC_INSERT,
                  KC_PGUP,
                  KC_PGDN,        KC_SPACE,       MO(1)),

/* Keymap 1: AltGr layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |  F11   |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |        |   Å  |   |  |   {  |   }  |   $  |      |           |  L1  |   `  |   <  |   >  |   &  |   +  |  F12   |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LCtrl  |   ;  |   /  |   (  |   )  |   #  |------|           |------|   ?  |   [  |   ]  |   "  |   '  |   –    |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | M2     |   :  |   @  |   =  |   !  |   \  |      |           |      |   %  |   ~  |   ^  |   *  |      | RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |      | LAlt |AltSft| Win  |                                       | AltGR| RCtrl|      |      |        |
 *   `----------------------------------'                                       `------------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      |      |       |      |      |
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      |      |       |      |        |      |
 *                                 | Space|      |------|       |------| Space  |  M1  |
 *                                 |      |      |      |       |      |        |      |
 *                                 `--------------------'       `----------------------'
 */
[1] = LAYOUT_ergodox(
  // left hand
  KC_NO,          KC_F1,          KC_F2,          KC_F3,          KC_F4,          KC_F5,          KC_NO,
  KC_NO,          NO_AM,          OM_PIPE,        OM_LCBR,        OM_RCBR,        OM_DLR,         KC_NO,
  KC_TRANSPARENT, OM_SCLN,        OM_SLSH,        OM_LPRN,        OM_RPRN,        OM_HASH,
  MO(2),          OM_COLN,        OM_AT,          OM_EQL,         KC_EXLM,        OM_BSLS,        KC_NO,

  KC_NO,          KC_NO,          KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,

                                  KC_NO,          KC_NO,
                                                  KC_NO,
                  KC_TRANSPARENT, KC_NO,          KC_NO,

  // right hand
  KC_NO,          KC_F6,          KC_F7,          KC_F8,          KC_F9,          KC_F10,         KC_F11,
  KC_TRANSPARENT, OM_GRAV,        NO_LESS,        OM_GRTR,        OM_AMPR,        NO_PLUS,        KC_F12,
                  OM_QUES,        OM_LBRC,        OM_RBRC,        OM_QUOT,        NO_APOS,        OM_UNDS,
  KC_NO,          KC_PERC,        OM_TILD,        OM_CIRC,        OM_ASTR,        KC_NO,          KC_TRANSPARENT,

                                  KC_TRANSPARENT, KC_TRANSPARENT,  KC_NO,          KC_NO,          KC_NO,

                                  KC_NO,          KC_NO,
                                                  KC_NO,
                  KC_NO,          KC_TRANSPARENT, KC_NO),

/* Keymap 2: AltGr + Shift layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |        |      |      |      |      |      |      |           |      |      | " D  |      |      |      |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |        |      |      |   €  |   £  |      |------|           |------|      | ` D  | ´ D  |  ”   | ẞ    |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | M2     |      |      |      |      |      |      |           |      |      | ~ D  | ^ D  |      |      |        |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |      |      |      |      |                                       |      |      |      |      |        |
 *   `----------------------------------'                                       `------------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      |      |       |      |      |
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      |      |       |      |        |      |
 *                                 | Space|      |------|       |------| Space  |      |
 *                                 |      |      |      |       |      |        |      |
 *                                 `--------------------'       `----------------------'
 */
[2] = LAYOUT_ergodox(
  // left hand
  KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,
  KC_NO,          LSFT(NO_AM),    KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,
  KC_NO,          KC_NO,          KC_NO,          OM_EURO,        OM_PND,         KC_NO,
  KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,

  KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,

                                  KC_NO,          KC_NO,
                                                  KC_NO,
                  KC_TRANSPARENT, KC_NO,          KC_NO,

  // right hand
  KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,
  KC_NO,          KC_NO,          NO_DDIA,        KC_NO,          KC_NO,          KC_NO,          KC_NO,
                  KC_NO,          OM_DGRAV,       NO_DACT,        OM_DQUOT,       OM_ESZETT,      KC_NO,
  KC_NO,          KC_NO,          OM_DTILD,       OM_DCIRC,       KC_NO,          KC_NO,          KC_NO,

                                  KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,

                                  KC_NO,          KC_NO,
                                                  KC_NO,
                  KC_NO,          KC_TRANSPARENT, KC_NO),

/* Keymap 3: Mouse + keypad
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * | Esc    |      |      |      |      |      |      |           |      |      |      |      |      |      | BackSp |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Tab    |      |      | M_UP |      |      |  L3  |           |      |      |  7   |  8   | 9    | +    | Enter  |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LCtrl  |      | M_L  | M_DW | M_R  |      |------|           |------| .    |  4   |  5   | 6    |      |   -    |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LShift |      |      |      |      |      |      |           |      | ,    |  1   |  2   | 3    |      | RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   | DOWN | UP   | LAlt |AltSft| Win  |                                       |  0   | RCtrl|      | LEFT | RIGHT  |
 *   `----------------------------------'                                       `------------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        | R_M1 | R_M2 |       | P_M1 | P_M2 |
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      | Home |       | PgUp |        |      |
 *                                 | Space|Backsp|------|       |------| M_BTN1 | M_BTN2
 *                                 |      |ace   | End  |       | PgDn |        |      |
 *                                 `--------------------'       `----------------------'
 */
[3] = LAYOUT_ergodox(
  // left hand
  KC_TRANSPARENT, KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,
  KC_TRANSPARENT, KC_NO,          KC_NO,          MS_UP,          KC_NO,          KC_NO,          KC_TRANSPARENT,
  KC_TRANSPARENT, KC_NO,          MS_LEFT,        MS_DOWN,        MS_RGHT,        KC_NO,
  KC_TRANSPARENT, KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,

  KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,

                                  DM_REC1,        DM_REC2,
                                                  KC_TRANSPARENT,
                  KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,


  // right hand
  KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_TRANSPARENT,
  KC_NO,          KC_NO,          KC_7,           KC_8,           KC_9,           NO_PLUS,        KC_TRANSPARENT,
                  KC_DOT,         KC_4,           KC_5,           KC_6,           KC_NO,          KC_TRANSPARENT,
  KC_NO,          KC_COMMA,       KC_1   ,        KC_2,           KC_3,           KC_NO,          KC_TRANSPARENT,

                                  KC_0,           KC_TRANSPARENT, KC_NO,          KC_TRANSPARENT, KC_TRANSPARENT,

                                  DM_PLY1,        DM_PLY2,
                                                  KC_TRANSPARENT,
                  KC_TRANSPARENT, MS_BTN1,        MS_BTN2),

/* Keymap 4: Finnish QWERTY
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * | Esc    |   1  |   2  |   3  |   4  |   5  |  L4  |           |      |   6  |   7  |   8  |   9  |   0  | BackSp |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Tab    |   Q  |   W  |   E  |   R  |   T  |  L3  |           |  L1  |   Y  |   U  |   I  |   O  |   P  | Enter  |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LCtrl  |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   Ö  |   Ä    |
 * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
 * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |   -  | RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   | DOWN |  UP  | LAlt |AltSft| Win  |                                       | AltGR| RCtrl|      | LEFT | RIGHT  |
 *   `----------------------------------'                                       `------------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      | R_S  |       | Del  |  Ins |
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      | Home |       | PgUp |        |      |
 *                                 | Space|Backsp|------|       |------| SPACE  |  M1  |
 *                                 |      |ace   | End  |       | PgDn |        |      |
 *                                 `--------------------'       `----------------------'
 */
[4] = LAYOUT_ergodox(
  // left hand
  KC_TRANSPARENT, KC_1,           KC_2,           KC_3,           KC_4,           KC_5,           KC_TRANSPARENT,
  KC_TRANSPARENT, KC_Q,           KC_W,           KC_E,           KC_R,           KC_T,           KC_TRANSPARENT,
  KC_TRANSPARENT, KC_A,           KC_S,           KC_D,           KC_F,           KC_G,
  KC_TRANSPARENT, KC_Z,           KC_X,           KC_C,           KC_V,           KC_B,           KC_TRANSPARENT,

  KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,

                                  KC_TRANSPARENT, KC_TRANSPARENT,
                                                  KC_TRANSPARENT,
                  KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,

  // right hand
  KC_NO,          KC_6,           KC_7,           KC_8,           KC_9,           KC_0,           KC_TRANSPARENT,
  KC_NO,          KC_Y,           KC_U,           KC_I,           KC_O,           KC_P,           KC_TRANSPARENT,
                  KC_H,           KC_J,           KC_K,           KC_L,           NO_OE,          NO_AE,
  KC_TRANSPARENT, KC_N,           KC_M,           KC_COMMA,       KC_DOT,         NO_MINS,        KC_TRANSPARENT,

                                  KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,

                  KC_TRANSPARENT, KC_TRANSPARENT,
                  KC_TRANSPARENT,
                  KC_TRANSPARENT, KC_TRANSPARENT, KC_NO),

};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case OM_QUOT:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_2));
            }
            break;
        case OM_HASH:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_3));
            }
            break;
        case OM_AMPR:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_6));
            }
            break;
        case OM_SLSH:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_7));
            }
            break;
        case OM_LPRN:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_8));
            }
            break;
        case OM_RPRN:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_9));
            }
            break;
        case OM_EQL:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_0));
            }
            break;
        case OM_QUES:
            if (record->event.pressed) {
                tap_code16(LSFT(NO_PLUS));
            }
            break;
        case OM_DGRAV:
            if (record->event.pressed) {
                tap_code16(LSFT(NO_DACT));
            }
            break;
        case OM_DCIRC:
            if (record->event.pressed) {
                tap_code16(LSFT(NO_DDIA));
            }
            break;
        case OM_GRTR:
            if (record->event.pressed) {
                tap_code16(LSFT(NO_LESS));
            }
            break;
        case OM_SCLN:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_COMM));
            }
            break;
        case OM_COLN:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_DOT));
            }
            break;
        case OM_UNDS:
            if (record->event.pressed) {
                tap_code16(LSFT(NO_MINS));
            }
            break;
        case OM_ASTR:
            if (record->event.pressed) {
                tap_code16(LSFT(KC_BSLS));
            }
            break;

        case OM_AT:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_2));
            }
            break;
        case OM_PND:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_3));
            }
            break;
        case OM_DLR:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_4));
            }
            break;
        case OM_LCBR:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_7));
            }
            break;
        case OM_LBRC:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_8));
            }
            break;
        case OM_RBRC:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_9));
            }
            break;
        case OM_RCBR:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_0));
            }
            break;
        case OM_PIPE:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_NUBS));
            }
            break;
        case OM_BSLS:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_MINS));
            }
            break;
        case OM_DTILD:
            if (record->event.pressed) {
                tap_code16(ALGR(NO_DDIA));
            }
            break;
        case OM_EURO:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_E));
            }
            break;
        case OM_DQUOT:
            if (record->event.pressed) {
                tap_code16(ALGR(LSFT(KC_2)));
            }
            break;
        case OM_ESZETT:
            if (record->event.pressed) {
                tap_code16(ALGR(KC_S));
            }
            break;

        case OM_TILD:
            if (record->event.pressed) {
                register_code(KC_RALT);
                tap_code(KC_RBRC); // ~ dead key
                unregister_code(KC_RALT);
                tap_code(KC_SPACE);
            }
            break;
        case OM_CIRC:
            if (record->event.pressed) {
                register_code(KC_LSFT);
                tap_code(KC_RBRC); // ^ dead key
                unregister_code(KC_LSFT);
                tap_code(KC_SPACE);
            }
            break;
        case OM_GRAV:
            if (record->event.pressed) {
                register_code(KC_LSFT);
                tap_code(KC_EQL); // ` dead key
                unregister_code(KC_LSFT);
                tap_code(KC_SPACE);
            }
            break;
  }
  return true;
}

// Runs just one time when the keyboard initializes.
void keyboard_post_init_user(void) {
#ifdef RGBLIGHT_COLOR_LAYER_0
    rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
#endif
};

// Runs whenever there is a layer state change.
layer_state_t layer_state_set_user(layer_state_t state) {
    ergodox_board_led_off();
    ergodox_right_led_1_off();
    ergodox_right_led_2_off();
    ergodox_right_led_3_off();

    uint8_t layer = get_highest_layer(state);
    switch (layer) {
        case 0:
#ifdef RGBLIGHT_COLOR_LAYER_0
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
#endif
            break;
        case 1:
            ergodox_right_led_1_on();
#ifdef RGBLIGHT_COLOR_LAYER_1
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_1);
#endif
            break;
        case 2:
            ergodox_right_led_2_on();
#ifdef RGBLIGHT_COLOR_LAYER_2
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_2);
#endif
            break;
        case 3:
            ergodox_right_led_3_on();
#ifdef RGBLIGHT_COLOR_LAYER_3
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_3);
#endif
            break;
        case 4:
            ergodox_right_led_1_on();
            ergodox_right_led_2_on();
#ifdef RGBLIGHT_COLOR_LAYER_4
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_4);
#endif
            break;
        case 5:
            ergodox_right_led_1_on();
            ergodox_right_led_3_on();
#ifdef RGBLIGHT_COLOR_LAYER_5
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_5);
#endif
            break;
        case 6:
            ergodox_right_led_2_on();
            ergodox_right_led_3_on();
#ifdef RGBLIGHT_COLOR_LAYER_6
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_6);
#endif
            break;
        case 7:
            ergodox_right_led_1_on();
            ergodox_right_led_2_on();
            ergodox_right_led_3_on();
#ifdef RGBLIGHT_COLOR_LAYER_7
            rgblight_setrgb(RGBLIGHT_COLOR_LAYER_7);
#endif
            break;
        default:
            break;
    }

    return state;
};

