#include "tapDance.h"

#include "quantum.h"

void left(qk_tap_dance_state_t* state, void* user_data) {
    switch (state->count) {
        case 1:
            if (state->pressed)
                tap_code16(S(KC_LBRACKET));
            else
                tap_code16(S(KC_9));
            break;
        case 2:
            if (state->pressed)
                tap_code16(S(KC_COMM));
            else
                tap_code(KC_LBRACKET);
            break;
        default:
            reset_tap_dance(state);
    }
}

void right(qk_tap_dance_state_t* state, void* user_data) {
    switch (state->count) {
        case 1:
            if (state->pressed)
                tap_code16(S(KC_RBRACKET));
            else
                tap_code16(S(KC_0));
            break;
        case 2:
            if (state->pressed)
                tap_code16(S(KC_DOT));
            else
                tap_code(KC_RBRACKET);
            break;
        default:
            reset_tap_dance(state);
    }
}

enum { REST, HOLD1, HOLD2, HOLD3 };

static int Alt = REST;
void       altFinish(qk_tap_dance_state_t* state, void* user_data) {
    switch (state->count) {
        case 1:
            if (state->pressed) {
                register_code(KC_LALT);
                Alt = HOLD1;
            }
            break;
        case 2:
            if (state->pressed) {
                register_code(KC_RALT);
                Alt = HOLD2;
            }
            break;
        case 3:
            if (state->pressed) {
                register_code(KC_RALT);
                register_code(KC_RSHIFT);
                Alt = HOLD3;
            }
            break;
        default:
            reset_tap_dance(state);
    }
}

void altReset(qk_tap_dance_state_t* state, void* user_data) {
    switch (Alt) {
        case HOLD1:
            unregister_code(KC_LALT);
            break;
        case HOLD2:
            unregister_code(KC_RALT);
            break;
        case HOLD3:
            unregister_code(KC_RSHIFT);
            unregister_code(KC_RALT);
            break;
    }
    Alt = REST;
}

static int Ctrl = REST;
void       ctrlFinish(qk_tap_dance_state_t* state, void* user_data) {
    switch (state->count) {
        case 1:
            if (state->pressed) {
                register_code(KC_LCTL);
                Ctrl = HOLD1;
            } else {
                tap_code(KC_ESC);
            }
            break;
        case 2:
            if (state->pressed) {
                register_code(KC_LGUI);
                Ctrl = HOLD2;
            }
            break;
        default:
            reset_tap_dance(state);
    }
}

void ctrlReset(qk_tap_dance_state_t* state, void* user_data) {
    switch (Ctrl) {
        case HOLD1:
            unregister_code(KC_LCTL);
            break;
        case HOLD2:
            unregister_code(KC_LGUI);
            break;
    }
    Ctrl = REST;
}

qk_tap_dance_action_t tap_dance_actions[] = {
    [ALT]   = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altFinish, altReset),
    [CTRL]  = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctrlFinish, ctrlReset),
    [LEFT]  = ACTION_TAP_DANCE_FN(left),
    [RIGHT] = ACTION_TAP_DANCE_FN(right),
};