#include <input/processors.dtsi>
#include <dt-bindings/zmk/input_transform.h>
#include <zephyr/dt-bindings/input/input-event-codes.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/pointing.h>

#define ZMK_POINTING_DEFAULT_SCRL_VAL 100
#define MOUSE 5
#define SCROLL 6

&mt {
    flavor = "balanced";
    quick-tap-ms = <0>;
};

&lt {
    quick-tap-ms = <300>;
    flavor = "balanced";
};

/ {
    combos {
        compatible = "zmk,combos";

        layer4_ESC {
            bindings = <&lt 4 ESC>;
            key-positions = <39 38>;
        };

        tab {
            bindings = <&kp TAB>;
            key-positions = <11 12>;
        };
    };

    macros {
        to_layer_0: to_layer_0 {
            compatible = "zmk,behavior-macro-one-param";
            #binding-cells = <1>;
            bindings = <&to 0 &macro_param_1to1 &kp MACRO_PLACEHOLDER>;
            label = "TO_LAYER_0";
        };
    };

    behaviors {
        lt_to_layer_0: lt_to_layer_0 {
            compatible = "zmk,behavior-hold-tap";
            label = "LAYER_TAP_TO_0";
            bindings = <&mo>, <&to_layer_0>;

            #binding-cells = <2>;
            tapping-term-ms = <200>;
        };

        scroll_up_down: mouse_wheel_up_down {
            compatible = "zmk,behavior-sensor-rotate";
            #sensor-binding-cells = <0>;
            bindings = <&msc SCRL_DOWN>, <&msc SCRL_UP>;

            tap-ms = <20>;
        };

        scroll_right_left: mouse_wheel_right_left {
            compatible = "zmk,behavior-sensor-rotate";
            #sensor-binding-cells = <0>;
            bindings = <&msc SCRL_LEFT>, <&msc SCRL_RIGHT>;

            tap-ms = <20>;
        };
    };

    keymap {
        compatible = "zmk,keymap";

        default_layer {
            bindings = <
&kp Q             &kp W         &kp E    &kp R          &kp T                                                          &kp Y        &kp U  &kp I      &kp O    &kp P
&kp A             &kp S         &kp D    &kp F          &kp G                                  &kp F13                 &kp H        &kp J  &kp K      &kp L    &kp SEMICOLON
&mt LEFT_SHIFT Z  &kp X         &kp C    &kp V          &kp B        &kp F14                   &kp F15                 &kp N        &kp M  &kp COMMA  &kp DOT  &kp SLASH
&kp LCTRL         &kp LEFT_WIN  &kp F16  &kp BACKSPACE  &lt 2 ENTER  &lt_to_layer_0 3 LANG2    &lt_to_layer_0 3 LANG1  &lt 1 SPACE                             &kp LEFT_ALT
            >;

            sensor-bindings = <&scroll_up_down>;
        };

        layer_1 {
            bindings = <
&kp NUMBER_1  &kp NUMBER_2  &kp NUMBER_3      &kp NUMBER_4       &kp NUMBER_5                    &kp NUMBER_6  &kp NUMBER_7          &kp NUMBER_8           &kp NUMBER_9  &kp NUMBER_0
&trans        &trans        &kp LEFT_BRACKET  &kp RIGHT_BRACKET  &trans                  &trans  &trans        &kp LEFT_PARENTHESIS  &kp RIGHT_PARENTHESIS  &trans        &kp BACKSLASH
&trans        &trans        &trans            &trans             &trans        &trans    &trans  &trans        &trans                &trans                 &trans        &kp PIPE
&trans        &trans        &trans            &trans             &trans        &trans    &trans  &trans                                                                   &trans
            >;

            sensor-bindings = <&scroll_right_left>;
        };

        layer_2 {
            bindings = <
&kp EXCLAMATION  &kp AT_SIGN  &kp POUND          &kp DOLLAR  &kp PERCENT                      &kp CARET  &kp AMPERSAND  &kp ASTERISK  &kp MINUS  &kp UNDERSCORE
&kp GRAVE        &kp TILDE    &kp DOUBLE_QUOTES  &kp SQT     &trans                  &trans   &mkp MB3   &mkp MB1       &mkp MB2      &kp EQUAL  &kp PLUS
&kp F1           &kp F2       &kp F3             &kp F4      &kp F5       &kp F11    &kp F12  &kp F6     &kp F7         &kp F8        &kp F9     &kp F10
&trans           &trans       &trans             &trans      &trans       &trans     &trans   &trans                                             &trans
            >;

            sensor-bindings = <&scroll_up_down>;
        };

        layer_3 {
            bindings = <
&trans  &kp LC(LS(TAB))     &kp PRINTSCREEN         &kp LC(TAB)              &trans                                     &trans  &kp HOME        &kp UP_ARROW    &kp END          &trans
&trans  &kp LG(LEFT_ARROW)  &kp LG(RIGHT_ARROW)     &kp LC(LG(LEFT_ARROW))   &kp LC(LG(RIGHT_ARROW))            &trans  &trans  &kp LEFT_ARROW  &kp DOWN_ARROW  &kp RIGHT_ARROW  &trans
&trans  &kp LEFT_SHIFT      &kp LG(LS(LEFT_ARROW))  &kp LG(LS(RIGHT_ARROW))  &trans                   &trans    &trans  &trans  &kp DELETE      &kp PAGE_UP     &kp PAGE_DOWN    &trans
&trans  &trans              &trans                  &trans                   &trans                   &trans    &trans  &trans                                                   &trans
            >;

            sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>;
        };

        layer_4 {
            bindings = <
&trans  &trans  &trans  &trans  &trans                         &bt BT_SEL 0  &bt BT_SEL 1  &bt BT_SEL 2  &bt BT_SEL 3  &bt BT_SEL 4
&trans  &trans  &trans  &trans  &trans            &trans       &trans        &trans        &trans        &trans        &trans
&trans  &trans  &trans  &trans  &trans  &trans    &bootloader  &trans        &trans        &trans        &trans        &bt BT_CLR
&trans  &trans  &trans  &trans  &trans  &trans    &trans       &trans                                                  &bt BT_CLR_ALL
            >;

            sensor-bindings = <&scroll_up_down>;
        };

        MOUSE {
            bindings = <
&trans  &trans    &trans    &trans    &trans                    &trans  &trans    &trans    &trans    &trans
&trans  &mkp MB3  &mkp MB2  &mkp MB1  &trans            &trans  &trans  &mkp MB1  &mkp MB2  &mkp MB3  &trans
&trans  &trans    &trans    &trans    &trans  &trans    &trans  &trans  &trans    &trans    &trans    &trans
&trans  &trans    &trans    &trans    &trans  &trans    &trans  &trans                                &trans
            >;

            sensor-bindings = <&scroll_up_down>;
        };

        SCROLL {
            bindings = <
&trans  &trans  &trans  &trans  &trans                    &trans  &trans  &trans  &trans  &trans
&trans  &trans  &trans  &trans  &trans            &trans  &trans  &trans  &trans  &trans  &trans
&trans  &trans  &trans  &trans  &trans  &trans    &trans  &trans  &trans  &trans  &trans  &trans
&trans  &trans  &trans  &trans  &trans  &trans    &trans  &trans                          &trans
            >;

            sensor-bindings = <&scroll_up_down>;
        };
    };
};
