/* Copyright 2019 Branden Byers (@brandenbyers)
 *
 * 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

enum layers {
    _BASE,   // base layer
    _MUSIC,  // music mode
    _MIDI,   // midi mode
    _MOUSE,  // mouse keys
    _ADMIN   // admin duties
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    //           ┌─────────┬─────────┬─────────┬─────────┬─────────┐
    //           │         │         │         │         │         │
    //           │    7    │    8    │    9    │    /    │  ADMIN  │
    //  ROTARY   │         │         │         │         │         │
    //  RIGHT:   ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE DOWN│         │         │         │         │         │
    //           │    4    │    5    │    6    │    *    │  MOUSE  │
    //  ROTARY   │         │         │         │         │         │
    //  LEFT:    ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE UP  │         │         │         │         │         │
    //           │    1    │    2    │    3    │    -    │  MIDI   │
    //           │         │         │         │         │         │
    // ┌─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
    // │  TOGGLE │         │         │         │         │         │
    // │  MUSIC  │    0    │    .    │    =    │    +    │  MUSIC  │
    // │         │         │         │         │         │         │
    // └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

    [_BASE] = LAYOUT(
                KC_P7,    KC_P8  , KC_P9  , KC_PSLS, MO(_ADMIN),
                KC_P4,    KC_P5  , KC_P6  , KC_PAST, TG(_MOUSE),
                KC_P1,    KC_P2  , KC_P3  , KC_PMNS, TG(_MIDI),
        MU_TOG, KC_P0,    KC_PDOT, KC_PEQL, KC_PPLS, MO(_MUSIC)
    ),

    // MUSIC LAYER
    //           ┌─────────┬─────────┬─────────┬─────────┬─────────┐
    //           │         │         │         │         │         │
    //           │         │         │         │         │         │
    //  ROTARY   │         │         │         │         │         │
    //  RIGHT:   ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE DOWN│         │         │         │         │         │
    //           │         │         │         │         │         │
    //  ROTARY   │         │         │         │         │         │
    //  LEFT:    ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE UP  │         │         │         │         │         │
    //           │         │         │         │  MODE   │         │
    //           │         │         │         │         │         │
    // ┌─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
    // │         │         │         │         │         │         │
    // │         │ RECORD  │  STOP   │         │  PLAY   │         │
    // │         │         │         │         │         │         │
    // └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

    [_MUSIC] = LAYOUT(
                 _______, _______, _______, _______, _______,
                 _______, _______, _______, _______, _______,
                 _______, _______, _______, _______, MU_MOD,
        _______, KC_LCTL, KC_LALT, _______, KC_LGUI, _______
    ),

    // MIDI LAYER
    //           ┌─────────┬─────────┬─────────┬─────────┬─────────┐
    //           │         │         │         │         │         │
    //           │   D♯    │    E    │    F    │   F♯    │    G    │
    //  ROTARY   │         │         │         │         │         │
    //  RIGHT:   ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE DOWN│         │         │         │         │         │
    //           │   A♯    │    B    │    C    │   C♯    │    D    │
    //  ROTARY   │         │         │         │         │         │
    //  LEFT:    ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE UP  │         │         │         │         │         │
    //           │    F    │   F♯    │    G    │   G♯    │    A    │
    //           │         │         │         │         │         │
    // ┌─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
    // │         │         │         │         │         │         │
    // │         │    C    │   C♯    │    D    │   D♯    │    E    │
    // │         │         │         │         │         │         │
    // └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

    [_MIDI] = LAYOUT(
                 MI_Ds_3, MI_E_3,  MI_F_3,  MI_Fs_3, MI_G_3,
                 MI_As_2, MI_B_2,  MI_C_3,  MI_Cs_3, MI_D_3,
                 MI_F_2,  MI_Fs_2, MI_G_2,  MI_Gs_2, TG(_MIDI),
        _______, MI_C_2,  MI_Cs_2, MI_D_2,  MI_Ds_2, MI_E_2
    ),

    // MOUSE LAYER
    //           ┌─────────┬─────────┬─────────┬─────────┬─────────┐
    //           │         │         │         │         │         │
    //           │  BTN 5  │         │  WHEEL  │         │         │
    //  ROTARY   │         │         │   UP    │         │         │
    //  RIGHT:   ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE DOWN│         │         │         │         │         │
    //           │         │  LEFT   │  MOUSE  │  RIGHT  │         │
    //  ROTARY   │         │  CLICK  │   UP    │  CLICK  │         │
    //  LEFT:    ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE UP  │         │         │         │         │         │
    //           │  BTN 4  │  MOUSE  │  MOUSE  │  MOUSE  │         │
    //           │         │  LEFT   │  DOWN   │  RIGHT  │         │
    // ┌─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
    // │         │         │         │         │         │         │
    // │         │  BTN 3  │  WHEEL  │  WHEEL  │  WHEEL  │         │
    // │         │         │  LEFT   │  DOWN   │  RIGHT  │         │
    // └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

    [_MOUSE] = LAYOUT(
                 KC_BTN5, _______, KC_WH_U, _______, _______,
                 _______, KC_BTN1, KC_MS_U, KC_BTN2, TG(_MOUSE),
                 KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, _______,
        _______, KC_BTN3, KC_WH_L, KC_WH_D, KC_WH_R, _______
    ),

    // ADMIN LAYER
    //           ┌─────────┬─────────┬─────────┬─────────┬─────────┐
    //           │         │         │         │         │         │
    //           │  RESET  │         │         │         │         │
    //  ROTARY   │         │         │         │         │         │
    //  RIGHT:   ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE DOWN│         │         │         │         │         │
    //           │    4    │    5    │    6    │    *    │         │
    //  ROTARY   │         │         │         │         │         │
    //  LEFT:    ├─────────┼─────────┼─────────┼─────────┼─────────┤
    //  PAGE UP  │         │         │         │         │         │
    //           │    1    │    2    │    3    │         │         │
    //           │         │         │         │         │         │
    // ┌─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
    // │         │         │         │         │         │         │
    // │         │    0    │    .    │    =    │         │         │
    // │         │         │         │         │         │         │
    // └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

    [_ADMIN] = LAYOUT(
                 RESET,   _______, _______, _______, TG(_ADMIN),
                 _______, _______, _______, _______, _______,
                 _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______
    ),
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    return true;
};

bool encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) { /* First encoder */
        if (clockwise) {
            tap_code(KC_PGDN);
        } else {
            tap_code(KC_PGUP);
        }
    }
    return true;
}