#include "keymap_common.h"

/* id for user defined functions */
enum function_id {
    LSHIFT_LPAREN,
    RSHIFT_RPAREN,
    LALT_LBRC,
    RALT_RBRC
};

const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = KEYMAP(
    FN0, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,            PSCR,SLCK,PAUS,     VOLD,VOLU,MUTE,CAPS,
    GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,      INS, HOME,PGUP,     FN5,EQL, PSLS,PAST,
    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,      DEL, END, PGDN,     HOME, UP,   PGUP,  PMNS,
    ESC,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN, QUOT,     ENT,                           LEFT, NO,   RGHT,  PPLS,
    FN1, NUBS,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,     FN2,            UP,            END,  DOWN, PGDN,
    LCTL,FN3, LGUI,           SPC,                          RGUI, FN4,RCTL,     LEFT,DOWN,RGHT,     P0,       PDOT,PENT
    ),
    [1] = KEYMAP(
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MPRV, MPLY, MNXT, MUTE, VOLD, VOLU,         TRNS, TRNS, TRNS,    TRNS, TRNS, TRNS, PWR,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,   TRNS, TRNS, TRNS,    TRNS, TRNS, TRNS, TRNS,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,   TRNS, TRNS, TRNS,    TRNS, TRNS, TRNS, TRNS,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,       TRNS,                        TRNS, TRNS, TRNS, TRNS,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,       TRNS,        TRNS,           TRNS, TRNS, TRNS,
    TRNS,  TRNS, TRNS,          TRNS,                            TRNS, TRNS,       TRNS,   TRNS,TRNS,TRNS,     TRNS,        TRNS, TRNS
    ),
    [2] = KEYMAP(
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MPRV, MPLY, MNXT, MUTE, VOLD, VOLU,         TRNS, TRNS, TRNS,    TRNS, TRNS, TRNS, PWR,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,   TRNS, TRNS, TRNS,    FN6,  TRNS, TRNS, TRNS,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,   TRNS, TRNS, TRNS,    P7,  P8,  P9,     TRNS,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,       TRNS,                        P4,  P5,  P6,     TRNS,
    TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,       TRNS,        TRNS,           P1,  P2,  P3,
    TRNS,  TRNS, TRNS,          TRNS,                            TRNS, TRNS,       TRNS,   TRNS,TRNS,TRNS,     P0,       PDOT,   TRNS
    )
};

const action_t PROGMEM fn_actions[] = {
    [0] = ACTION_LAYER_MOMENTARY(1),
    [1] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // Function: LShift with tap '('
    [2] = ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // Function: RShift with tap ')'
    [3] = ACTION_FUNCTION_TAP(LALT_LBRC), // Function: LALT with tap '['
    [4] = ACTION_FUNCTION_TAP(RALT_RBRC), // Function: RALT with tap ']'
    [5] = ACTION_LAYER_SET(2, ON_RELEASE), // switching to the numlock layer
    [6] = ACTION_LAYER_SET(0, ON_RELEASE) // switching back to the main layer
};

/*
 * user defined action function
 */
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    if (record->event.pressed) dprint("P"); else dprint("R");
    dprintf("%d", record->tap.count);
    if (record->tap.interrupted) dprint("i");
    dprint("\n");

    switch (id) {
        case LSHIFT_LPAREN:
            //FYI: custom written function
            space_cadet_modifier(record, KC_LSHIFT, KC_9, 1);
            break;
        case RSHIFT_RPAREN:
            space_cadet_modifier(record, KC_RSHIFT, KC_0, 1);
            break;
        case LALT_LBRC:
            space_cadet_modifier(record, KC_LALT, KC_LBRC, 0);
            break;
        case RALT_RBRC:
            space_cadet_modifier(record, KC_RALT, KC_RBRC, 0);
            break;
    }
}
