#include "keymap.h"

extern keymap_config_t keymap_config;

#define _baseLayer LAYOUT( \
  KC_QUOTE,    KC_COMMA,    KC_DOT,      KC_P,        KC_Y,           /**/KC_F,           KC_G,        KC_C,        KC_R,        KC_L,        \
  CTL_T(KC_A), SFT_T(KC_O), ALT_T(KC_E), KC_U,        KC_I,           /**/KC_D,           KC_H,        ALT_T(KC_T), SFT_T(KC_N), CTL_T(KC_S), \
  KC_SCOLON,   KC_Q,        KC_J,        KC_K,        KC_X,           /**/KC_B,           KC_M,        KC_W,        KC_V,        KC_Z,        \
  TD(DA_UPLY), MO(_VL),     KC_TAB,      KC_BSPACE,   KC_ESC,         /**/KC_INS,         KC_HOME,     KC_PGUP,     MO(_VL),     TD(DA_UPLY), \
  TD(DA_DWLY), TD(DA_LCTL), KC_SPC,      TD(DA_LSPR), LSFT_T(KC_CAPS),/**/SFT_T(KC_CAPS), TD(DA_RALT), KC_ENT,      TD(DA_RCTL), TD(DA_DWLY))

#define _GMLayer LAYOUT(                                              \
  KC_QUOTE,    KC_COMMA,    KC_DOT,      KC_P,        KC_Y,           /**/KC_F,           KC_G,        KC_C,        KC_R,        KC_L, \
  KC_A,        KC_O,        KC_E,        KC_U,        KC_I,           /**/KC_D,           KC_H,        ALT_T(KC_T), SFT_T(KC_N), CTL_T(KC_S), \
  KC_SCOLON,   KC_Q,        KC_J,        KC_K,        KC_X,           /**/KC_B,           KC_M,        KC_W,        KC_V,        KC_Z, \
  TD(DA_UPLY), MO(_VL),     KC_TAB,      KC_BSPACE,   KC_ESC,         /**/KC_INS,         KC_HOME,     KC_PGUP,     MO(_VL),     TD(DA_UPLY), \
  TD(DA_DWLY), TD(DA_LCTL), KC_SPC,      TD(DA_LSPR), LSFT_T(KC_CAPS),/**/SFT_T(KC_CAPS), TD(DA_RALT), KC_ENT,      TD(DA_RCTL), TD(DA_DWLY))

#define _upLayer LAYOUT( \
  KC_4,          KC_5,          KC_6,          KC_YREG,  _______,/**/ _______,  KC_RBRC,  _______,  _______,  _______, \
  LCTL_T(KC_1),  LSFT_T(KC_2),  LALT_T(KC_3),  _______,  _______,/**/ KC_LBRC,  KC_BSLS,  _______,  _______,  _______, \
  KC_7,          KC_8,          KC_9,          KC_0,     KC_GRV, /**/ KC_SLSH,  _______,  _______,  _______,  _______, \
  _______,       _______,       _______,       _______,  _______,/**/ KC_DEL,   KC_END,   KC_PGDN,  _______,  _______, \
  _______,       _______,       _______,       _______,  _______,/**/ _______,  _______,  _______,  _______,  _______)

#define _downLayer LAYOUT( \
  KC_F4,         KC_F5,         KC_F6,         KC_F12,   _______,/**/ _______,  KC_RPRN,  _______,  _______,  _______,  \
  LCTL_T(KC_F1), LSFT_T(KC_F2), LALT_T(KC_F3), KC_F11,   _______,/**/ KC_LPRN,  KC_EQUAL, KC_LEFT,  KC_UP,    KC_RIGHT, \
  KC_F7,         KC_F8,         KC_F9,         KC_F10,   _______,/**/ KC_MINUS, _______,  _______,  KC_DOWN,  _______,  \
  _______,       _______,       _______,       _______,  _______,/**/ KC_PSCR,  KC_SLCK,  KC_PAUSE, _______,  _______,  \
  _______,       _______,       _______,       _______,  _______,/**/ _______,  _______,  _______,  _______,  _______)

#define _astdLayer LAYOUT( \
  KC_MPRV,     KC_MUTE,      _______,      _______,      _______,/**/KC_PSCR,   KC_SLCK,  KC_PAUSE, _______, KC_RGUP,  \
  KC_MPLY,     KC_VOLD,      _______,      _______,      _______,/**/_______,   _______,  _______,  _______, KC_RGDWN, \
  KC_MNXT,     KC_VOLU,      RESET,        _______,      _______,/**/_______,   _______,  RESET,    _______, _______,  \
  _______,     _______,      _______,      _______,      _______,/**/_______,   _______,  _______,  _______, _______,  \
  _______,     _______,      _______,      _______,      _______,/**/_______,   _______,  _______,  _______, _______)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_BL] = _baseLayer,
    [_UL] = _upLayer,
    [_DL] = _downLayer,
    [_VL] = _upLayer,
    [_AL] = _astdLayer,
    [_GM] = _GMLayer};

bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  if (record->event.pressed) {
    switch (keycode) {
    case YREG:
      SEND_STRING("\"0p");
      return false;
    }
  }

  return true;
}