/* Copyright 2021 Joshua T.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H
#include "process_records.h"

uint8_t mod_state;


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

// Runs for each key down or up event.
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    // Returning true here will cause QMK to continue handling the key normally.
    // Returning false indicates that we've handled everything the keycode should do, and QMK
    // should not continue handling the keypress.
    //
    // NOTE: There is also a process_record_kb function that can be defined in the keyboard-
    // specific code. This allows the keyboard to have its own process_record function.
    // This is supposed to be "higher" than the user function, meaning the kb function
    // is shared for all keymaps for the keyboard.
    //
    // For this reason, I add my own function, called process_record_user_kb, and at the end
    // of this function, I defer to that one if it exists.
    // return process_record_user(keycode, record);


    // Custom keycode / function handling, based on the core function
    // process_record_quantum
    // https://github.com/qmk/qmk_firmware/blob/master/quantum/quantum.c

    if (!(
#ifdef USER_CAPS_WORD_ENABLE
        process_record_caps_word(keycode, record) &&
#endif
#ifdef USER_MOUSE_JIGGLE_ENABLE
        process_record_mouse_jiggle(keycode, record) &&
#endif
#ifdef USER_NUM_WORD_ENABLE
        process_record_num_word(keycode, record) &&
#endif
#ifdef USER_SECRETS_ENABLE
        process_record_secrets(keycode, record) &&
#endif
#ifdef USER_SUPER_ALT_TAB_ENABLE
        process_record_super_alt_tab(keycode, record) &&
#endif
        true)) {
        return false;
    }


    // Miscellaneous keycode handling
    mod_state = get_mods();

    switch(keycode)
    {
        case QK_MAKE: {
            if (record->event.pressed)
                SEND_STRING("qmk compile --keyboard " QMK_KEYBOARD " --keymap " QMK_KEYMAP);
            return false;
        }
        case QK_FLSH: {
            if (record->event.pressed) {
                SEND_STRING("qmk flash --keyboard " QMK_KEYBOARD " --keymap " QMK_KEYMAP);
            }
            return false;
        }
        case QK_VERS: {
            if (record->event.pressed) {
                SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE);
            }
            return false;
        }
        case PRG_EQ: {
            if (record->event.pressed) {
                SEND_STRING("==");
            }
            return false;
        }
        case PRG_NE: {
            if (record->event.pressed) {
                SEND_STRING("!=");
            }
            return false;
        }
        case PRG_GEQ: {
            if (record->event.pressed) {
                SEND_STRING(">=");
            }
            return false;
        }
        case PRG_LEQ: {
            if (record->event.pressed) {
                SEND_STRING("<=");
            }
            return false;
        }
        case PRG_ARR: {
            if (record->event.pressed) {
                SEND_STRING("=>");
            }
            return false;
        }

        case PS_ITEM: {
            if (record->event.pressed) {
                SEND_STRING("$_");
            }
            return false;
        }
        case FS_PIPE: {
            if (record->event.pressed) {
                SEND_STRING("|>");
            }
            return false;
        }
        case FS_ARR: {
            if (record->event.pressed) {
                SEND_STRING("->");
            }
            return false;
        }
        case SHEBANG: {
            if (record->event.pressed) {
                SEND_STRING("#!");
            }
            return false;
        }
    }

    return process_record_user_kb(keycode, record);
}