// Copyright 2023 @miketronic -- Mike B <mxb540@gmail.com>
// SPDX-License-Identifier: GPL-2.0+

#include "miketronic.h"
#include "process_records.h"

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

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


bool process_record_user(uint16_t keycode, keyrecord_t *record) {

    switch (keycode) {
        case VERSION:
            if (!record->event.pressed) {
                send_string_with_delay_P(PSTR(QMK_KEYBOARD ":" QMK_KEYMAP "\nVersion:" QMK_VERSION ", built: " QMK_BUILDDATE "\n"), MACRO_TIMER);
            }
            break;

        case M01:
            if (record->event.pressed) {
                SEND_STRING("//a11");
            }
            break;

        case M02:
            if (record->event.pressed) {
                SEND_STRING("//a12");
            }
            break;

        case M03:
            if (record->event.pressed) {
                SEND_STRING("//a08");
            }
            break;

        case M04:
            if (record->event.pressed) {
                SEND_STRING("//a09");
            }
            break;

        case M05:
            if (record->event.pressed) {
                SEND_STRING("//th");
            }
            break;

        case M06:
            if (record->event.pressed) {
                SEND_STRING("//re");
            }
            break;

        case M07:
            if (record->event.pressed) {
                SEND_STRING("//yw");
            }
            break;

        case M08:
            if (record->event.pressed) {
                tap_random_base64();
            }
            break;

        case CCCV: // One key copy/paste
            if (record->event.pressed) {
                copy_paste_timer = timer_read();
            } else {
                if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
                    tap_code16(LCTL(KC_C));
                } else { // Tap, paste
                    tap_code16(LCTL(KC_V));
                }
            }
            break;

        case IENTER: // Tap for letter "i", slight hold for "enter"
            if (record->event.pressed) {
                copy_paste_timer = timer_read();
            } else {
                if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, enter
                    tap_code16(KC_ENT);
                } else { // Tap, "i"
                    tap_code16(KC_I);
                }
            }
            break;

        case PRN:
            if (record->event.pressed) {
                SEND_STRING("()");
                tap_code(KC_LEFT);
            }
            break;

        case BRACES:
            if (record->event.pressed) {
                uint8_t shifted = get_mods() & (MOD_MASK_SHIFT);
                    if (shifted) {
                        unregister_code(KC_LSFT);
                        unregister_code(KC_RSFT);
                        SEND_STRING("<>"SS_TAP(X_LEFT));
                    }
                    else {
                        SEND_STRING("[]"SS_TAP(X_LEFT));
                    }
            }
            break;

#if defined(RGBLIGHT_ENABLE)
        case RGB1:
            if (record->event.pressed) {
                rgblight_sethsv_noeeprom(HSV_BLUE);
            }
            break;

        case RGB2:
            if (record->event.pressed) {
                rgblight_sethsv_noeeprom(HSV_RED);
            }
            break;

        case RGB3:
            if (record->event.pressed) {
                rgblight_sethsv_noeeprom(HSV_ORANGE);
            }
            break;

        case RGB4:
            if (record->event.pressed) {
                rgblight_sethsv_noeeprom(HSV_WHITE);
            }
            break;

        case RGB5:
            if (record->event.pressed) {
                rgblight_sethsv_noeeprom(HSV_GREEN);
            }
            break;
#endif
    }
    return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
}