import board

import kb

from kmk.keys import KC
from kmk.modules.combos import Combos, Sequence
from kmk.modules.dynamic_sequences import DynamicSequences
from kmk.modules.layers import Layers
from kmk.modules.oneshot import OneShot

combos = Combos()
dyn_seq = DynamicSequences(
    slots=1, # The number of sequence slots to use
    timeout=60000,  # Maximum time to spend in record or config mode before stopping automatically, milliseconds
    key_interval=20,  # Milliseconds between key events while playing
    use_recorded_speed=False,  # Whether to play the sequence at the speed it was typed
)
layers = Layers()
oneshot = OneShot()

keyboard = kb.KMKKeyboard()
keyboard.modules = [combos, dyn_seq, layers, oneshot]
keyboard.debug_enabled = False

# Convenience variables for the Keymap
_______ = KC.TRNS
xxxxxxx = KC.NO

L1_TAB = KC.LT(1, KC.TAB, prefer_hold=True)
L2_ENT = KC.LT(2, KC.ENT, prefer_hold=True)

OS_LSFT = KC.OS(KC.LSFT)

SEQ_REC = KC.RECORD_SEQUENCE()
SEQ_STP = KC.STOP_SEQUENCE()
SEQ_PLY = KC.PLAY_SEQUENCE()

combos.combos = [
    Sequence((KC.LEADER, KC.A), KC.LCTL(KC.A)),  # select All
    Sequence((KC.LEADER, KC.T), KC.LCTL(KC.X)),  # cuT
    Sequence((KC.LEADER, KC.C), KC.LCTL(KC.C)),  # Copy
    Sequence((KC.LEADER, KC.P), KC.LCTL(KC.V)),  # Paste
    Sequence((KC.LEADER, KC.U), KC.LCTL(KC.Z)),  # Undo
    Sequence((KC.LEADER, KC.Y), KC.LCTL(KC.Y)),  # redo
    ]

# flake8: noqa
keyboard.keymap = [
    [  # 0: Colemak-DH letters
        KC.ESC,  KC.Q,    KC.W,    KC.F,    KC.P,    KC.B,             KC.J,    KC.L,    KC.U,    KC.Y,    KC.SCLN, KC.LEADER,
        KC.LCTL, KC.A,    KC.R,    KC.S,    KC.T,    KC.G,    xxxxxxx, KC.M,    KC.N,    KC.E,    KC.I,    KC.O,    KC.QUOT,
        KC.LALT, KC.Z,    KC.X,    KC.C,    KC.D,    KC.V,             KC.K,    KC.H,    KC.COMM, KC.DOT,  KC.SLSH, KC.BSLS,
                 xxxxxxx,          KC.LGUI, OS_LSFT, KC.BSPC,          L1_TAB,    KC.SPACE,L2_ENT,             xxxxxxx,
    ],
    [  # 1: Nav & Numbers
        KC.TAB,  KC.N1,   KC.N2,   KC.N3,   KC.N4,   KC.N5,            KC.N6,   KC.N7,   KC.N8,   KC.N9,   KC.N0,   KC.DEL,
        _______, KC.LPRN, KC.LEFT, KC.UP,   KC.RIGHT,KC.RPRN, _______, KC.GRV,  KC.PLUS, KC.EQL,  xxxxxxx, xxxxxxx, xxxxxxx,
        _______, KC.LBRC, KC.LCBR, KC.DOWN, KC.RCBR, KC.RBRC,          KC.TILD, KC.MINS, KC.UNDS, xxxxxxx, xxxxxxx, xxxxxxx,
                 _______,          _______, _______, KC.DEL,           _______, _______, _______, _______,
    ],
    [  # 2: F-row & Board Functions
        KC.F12,  KC.F1,   KC.F2,   KC.F3,   KC.F4,   KC.F5,            KC.F6,   KC.F7,   KC.F8,   KC.F9,    KC.F10,  KC.F11,
        _______, SEQ_REC, SEQ_PLY, _______, _______, _______, _______, _______, _______, _______, _______,  _______, _______,
        _______, SEQ_STP, _______, _______, _______, _______,          _______, _______, _______, _______,  _______, _______,
                 _______,          _______, _______, _______,          _______, _______, _______,           _______, 
    ],
]

if __name__ == '__main__':
    keyboard.go()