#include "replicaJunction.h"
#include "version.h"

#ifdef TAP_DANCE_ENABLE
void dance_layer(qk_tap_dance_state_t *state, void *user_data)
{
    uint8_t layer = biton32(layer_state);

    if (state->count >= 5)
    {
        // 5 or more taps resets the keyboard
        reset_keyboard();
    }
    #ifdef L_QWERTY
    else if (state->count == 3)
    {
        // Triple tap changes to QWERTY layer
        if (layer == L_QWERTY)
        {
            layer_off(L_QWERTY);
        }
        else
        {
            layer_on(L_QWERTY);
        }
    }
    #endif
    #ifdef L_NUM
    else if (state->count == 2)
    {
        // Double tap toggles Number layer
        if (layer == L_NUM)
        {
            layer_off(L_NUM);
        }
        else
        {
            layer_on(L_NUM);
        }
    }
    #endif
    else
    {
        // Single tap sends Escape, and also turns off layers
        // That's mostly in case I get stuck and forget where I am
        #ifdef L_NUM
        layer_off(L_NUM);
        #endif
        #ifdef L_EXTEND
        layer_off(L_EXTEND);
        #endif
        #ifdef L_SYMBOL
        layer_off(L_SYMBOL);
        #endif
        #ifdef L_QWERTY
        layer_off(L_QWERTY);
        #endif
        register_code(KC_ESC);
        unregister_code(KC_ESC);
    }
};

// Tap Dance Definitions
// Note - this needs to come AFTER the function is declared
qk_tap_dance_action_t tap_dance_actions[] = {
        [TD_LAYER_TOGGLE] = ACTION_TAP_DANCE_FN(dance_layer)
};

#endif // TAP_DANCE_ENABLE

// These functions can be overridden in individual keymap files.
// This allows a user function to be shared for all my keyboards, while each
// keyboard can also have a keyboard-specific section.

// Note that keymaps don't need to override these if there's nothing to
// override them with.
__attribute__ ((weak))
void matrix_init_keymap(void) {}

__attribute__ ((weak))
void matrix_scan_keymap(void) {}

__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
        return true;
};

// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
    #ifdef UNICODEMAP_ENABLE
    // Set Unicode input to use WinCompose
    // https://github.com/samhocevar/wincompose
    set_unicode_input_mode(UC_WINC);
    #endif // UNICODEMAP_ENABLE

    matrix_init_keymap();
};

// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
    matrix_scan_keymap();
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    if (record->event.pressed)
        return true;

    switch(keycode)
    {
        case RJ_MAKE:  // Compiles the firmware, and adds the flash command based on keyboard bootloader
            SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
            #if  (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
                                    ":dfu"
            #elif defined(BOOTLOADER_HALFKAY)
                                    ":teensy"
            #elif defined(BOOTLOADER_CATERINA)
                                    ":avrdude"
            #endif // bootloader options
                                    //SS_TAP(X_ENTER)
                                    );
            return false;
        case RJ_QMKV:
            SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
            return false;
        case RJ_EQ:
            SEND_STRING("==");
            return false;
        case RJ_NEQ:
            SEND_STRING("!=");
            return false;
        case RJ_GEQ:
            SEND_STRING(">=");
            return false;
        case RJ_LEQ:
            SEND_STRING("<=");
            return false;
        case RJ_GEQR:
            SEND_STRING("=>");
            return false;
        case RJ_DUND:
            SEND_STRING("$_");
            return false;
        case RJ_SELS:
            SEND_STRING("select *");
            return false;
    }

    return process_record_keymap(keycode, record);
};