import ngModule from '../module';

directive.$inject = ['$document'];
export function directive($document) {
    let modifiers = ['alt', 'ctrl', 'meta', 'shift'];

    function checkAttributes($attrs) {
        let shortcut = $attrs.vnBind.split(' ');
        let keys = {};

        if (shortcut[0] == '')
            throw new Error('vnBind: Binding keys not defined');

        if (shortcut.length == 1) {
            keys.altKey = true;
            keys.ctrlKey = true;
        } else {
            let mods = shortcut.splice(0, shortcut.length - 1);
            for (let mod of mods) {
                if (modifiers.indexOf(mod) == -1)
                    throw new Error('vnBind: Invalid modifier key in binding');

                keys[`${mod}Key`] = true;
            }
        }

        keys.key = shortcut[0];
        if (keys.key == 'space') keys.key = ' ';

        return keys;
    }

    return {
        restrict: 'A',
        link: function($scope, $element, $attrs) {
            let shortcut = checkAttributes($attrs);

            function onKeyUp(event) {
                if (event.defaultPrevented) return;
                let correctShortcut = true;

                for (const key in shortcut) {
                    correctShortcut = correctShortcut
                        && shortcut[key] == event[key];
                }
                if (correctShortcut) {
                    event.preventDefault();
                    $element.triggerHandler('click');
                }
            }

            $document.on('keyup', onKeyUp);
            $element.on('$destroy', function() {
                $document.off('keyup', onKeyUp);
            });
        }
    };
}
ngModule.directive('vnBind', directive);