#pragma once
#include "quantum.h"

enum custom_keycodes {
    RGB_SLD = SAFE_RANGE,
    ALT_TAB,
    QWERTY,
    SYM,
    NAV,
    ADJUST,
    // Macros
    ARROW,
    IARROW,
    CLN_EQ,
    F_ARROW,
    GREP,
    // Accented characters
    AC_A,
    AC_E,
    AC_I,
    AC_O,
    // Custom multi-os key-codes
    CUT,
    COPY,
    PASTE,
    SAVE,
    UNDO,
    REDO,
    CHG_LAYOUT,
    FIND,
    WIN_TO_LEFT,
    WIN_TO_RIGHT,
    // OTHER OLD STUFF
    LOWER,
    RAISE,
    MAC_TGL,
    INC_MACROS_START,
    INC_MACROS_END,
};

//**************** KEYCODES *********************//
enum layers {
    _QWERTY,
    _SYMB,
    _NAV,
    _ADJUST,
    _F,
    _D,
    _S,
    _A,
    _J,
    _K,
    // iris specific - TBD
    _LOWER,
    _RAISE,
    _MACROS,
    _SAFE_LAYER
};

//===== Function letters
#define FN_F LT(_F, KC_F)
#define FN_D LT(_D, KC_D)
#define FN_S LT(_S, KC_S)
#define FN_A LT(_A, KC_A)
#define FN_K LT(_K, KC_K)
#define FN_J LT(_J, KC_J)
#define KC_FN_D FN_D
#define KC_FN_S FN_S
#define KC_FN_F FN_F

#define KC_MACROS OSL(_MACROS)

#define KC_E_COLN LSFT(KC_DOT)
#define KC_E_EQL ES_EQL
#define KC_GUI OSM(MOD_RGUI)
#define KC_R_NUB S(KC_NUBS)
#define KC_E_LT KC_NUBS
#define KC_E_GT S(KC_NUBS)
#define KC_E_TILD ES_TILD
#define KC_E_MINS ES_MINS
#define KC_E_OVRR ES_OVRR
#define KC_E_APOS ES_APOS
#define KC_E_IEXL ES_IEXL
//==========  Short hand for complex key combinations
#define WIN_LEFT_HALF LALT(LGUI(KC_LEFT))
#define WIN_RIGHT_HALF LALT(LGUI(KC_RIGHT))
#define ALL_WIN LCTL(KC_DOWN)
#define EXPOSE LGUI(KC_DOWN)
// ========== Modifiers!!
#define SHIFT OSM(MOD_LSFT)
//=============== tap for key hold for mod
#define HYPR_H HYPR_T(KC_H)
#define CTL_K RCTL_T(KC_K)
#define ALT_J ALT_T(KC_J)
#define SFT_MINS LSFT_T(KC_MINS)   // tap - hold shift
#define CMD_MINS GUI_T(KC_MINS)    // tap - hold cmd
#define CMD_QUOT GUI_T(KC_QUOTE)   // tap ' hold cmd
#define SFT_QUOT LSFT_T(KC_QUOTE)  // tap ' hold shift
//=============== Movement modified
#define CTL_LEFT LCTL(KC_LEFT)
#define CTL_RIGHT LCTL(KC_RIGHT)

#define SFT_LEFT LSFT(KC_LEFT)
#define SFT_RIGHT LSFT(KC_RIGHT)
#define SHIFT_UP LSFT(KC_UP)
#define SHIFT_DWN LSFT(KC_DOWN)
#define SFT_LEFT_END LGUI(LSFT(KC_LEFT))
#define SFT_RIGHT_END LGUI(LSFT(KC_RIGHT))