#include "eeprom.h"
#include "edvorakjp.h"

typedef union {
    uint8_t raw;
    struct {
        bool enable_kc_lang;  // for macOS
    };
} edvorakjp_config_t;
static edvorakjp_config_t edvorakjp_config;

typedef struct {
    bool japanese_mode;
} edvorakjp_state_t;
static edvorakjp_state_t edvorakjp_state;

/*
 * private methods
 */
uint8_t eeconfig_read_edvorakjp(void) { return eeprom_read_byte(EECONFIG_EDVORAK); }

void eeconfig_update_edvorakjp(uint8_t val) { eeprom_update_byte(EECONFIG_EDVORAK, val); }

/*
 * public methods
 */
void edvorakjp_status_init(void) {
    edvorakjp_state.japanese_mode = false;
    edvorakjp_config.raw          = eeconfig_read_edvorakjp();
}

bool get_enable_kc_lang(void) { return edvorakjp_config.enable_kc_lang; }

void set_enable_kc_lang(bool new_state) {
    edvorakjp_config.enable_kc_lang = new_state;
    eeconfig_update_edvorakjp(edvorakjp_config.raw);
}

bool get_japanese_mode(void) { return edvorakjp_state.japanese_mode; }

void set_japanese_mode(bool new_state) {
    edvorakjp_state.japanese_mode = new_state;
    if (edvorakjp_state.japanese_mode) {
        if (edvorakjp_config.enable_kc_lang) {
            SEND_STRING(SS_TAP(X_LANG1));
        } else {
            SEND_STRING(SS_LALT("`"));
        }
    } else {
        if (edvorakjp_config.enable_kc_lang) {
            SEND_STRING(SS_TAP(X_LANG2));
        } else {
            SEND_STRING(SS_LALT("`"));
        }
    }
}