#include "custom_encoder.h"
#include "custom_keycodes.h"

#ifdef RGB_OLED_MENU
#include "custom_rgb.h"

// I'm lazy and like constants over calculations, also using it as a compile time check
#if defined(RGB_MATRIX_ENABLE)
    #define RGB_FUNCTION_COUNT 6
#elif defined(RGBLIGHT_ENABLE)
    #define RGB_FUNCTION_COUNT 5
#endif

typedef void (*rgb_f)(void);

const rgb_f rgb_functions[RGB_FUNCTION_COUNT][2] = {
#if defined(RGB_MATRIX_ENABLE)
    { rgb_matrix_increase_hue,      rgb_matrix_decrease_hue     },
    { rgb_matrix_increase_sat,      rgb_matrix_decrease_sat     },
    { rgb_matrix_increase_val,      rgb_matrix_decrease_val     },
    { rgb_matrix_increase_speed,    rgb_matrix_decrease_speed   },
    { rgb_matrix_step,              rgb_matrix_step_reverse     },
    { rgb_matrix_increase_flags,    rgb_matrix_decrease_flags   }
#elif defined(RGBLIGHT_ENABLE)
    { rgblight_increase_hue,        rgblight_decrease_hue       },
    { rgblight_increase_sat,        rgblight_decrease_sat       },
    { rgblight_increase_val,        rgblight_decrease_val       },
    { rgblight_increase_speed,      rgblight_decrease_speed     },
    { rgblight_step,                rgblight_step_reverse       }
#endif
};

// Start at the end for mode
uint8_t rgb_encoder_state = 4;

bool process_record_encoder(uint16_t keycode, keyrecord_t *record)
{
    switch (keycode)
    {
        case RGB_ENC:
            if (record->event.pressed) {
                if (get_mods() & MOD_MASK_SHIFT) {
                    rgb_encoder_state = (rgb_encoder_state - 1);
                    if (rgb_encoder_state >= RGB_FUNCTION_COUNT)
                        rgb_encoder_state = RGB_FUNCTION_COUNT - 1;
                } else {
                    rgb_encoder_state = (rgb_encoder_state + 1) % RGB_FUNCTION_COUNT;
                }
            }
            return false;
    }
    return true;
}
#endif // RGB_OLED_MENU

const uint16_t PROGMEM encoders[][2] = {
    { KC_PGUP, KC_PGDN },
    { KC_VOLU, KC_VOLD }
};

bool encoder_update_user(uint8_t index, bool clockwise)
{
    if (!is_keyboard_master())
        return;

#ifdef RGB_OLED_MENU
    if (index == RGB_OLED_MENU)
        (*rgb_functions[rgb_encoder_state][clockwise])();
    else
#endif // RGB_OLED_MENU
        tap_code16(pgm_read_word(&encoders[index][clockwise]));
    return true;
}