/*-
 * ~~~~~~licensing~~~~~~
 * entaxy-management-plugin
 * ==========
 * Copyright (C) 2020 - 2025 EmDev LLC
 * ==========
 * You may not use this file except in accordance with the License Terms of the Copyright
 * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
 * rights to the Software and any copies are the property of the Copyright Holder. Unless
 * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
 * Software for commercial purposes to provide services to third parties.
 * 
 * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
 * Under no circumstances does the Copyright Holder guarantee or promise that the
 * Software provided by him will be suitable or not suitable for the specific purposes
 * of the User, that the Software will meet all commercial and personal subjective
 * expectations of the User, that the Software will work properly, without technical
 * errors, quickly and uninterruptedly.
 * 
 * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
 * to the User for any direct or indirect losses of the User, his expenses or actual
 * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
 * or damage to data, property, etc.
 * ~~~~~~/licensing~~~~~~
 */
var Entaxy;
(function (Entaxy) {

    let CodeMirror = window.CodeMirror;

    function completeAfter(cm, pred) {
        var cur = cm.getCursor();
        if (!pred || pred()) setTimeout(function() {
            if (!cm.state.completionActive) {
                cm.showHint({completeSingle: false});
            }
        }, 100);
        return CodeMirror.Pass;
    }

        function completeIfAfterLt(cm) {
            return completeAfter(cm, function() {
                var cur = cm.getCursor();
                return cm.getRange(CodeMirror.Pos(cur.line, cur.ch - 1), cur) == "<";
            });
        }

        function completeIfInTag(cm) {
            return completeAfter(cm, function() {
                var tok = cm.getTokenAt(cm.getCursor());
                if (tok.type == "string" && (!/['"]/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1)) {
                    return false;
                }
                var inner = CodeMirror.innerMode(cm.getMode(), tok.state).state;
                return inner.tagName;
            });
        }


        let extraKeys = {
            "'<'": completeAfter,
            "' '": completeIfInTag,
            "'='": completeIfInTag,
            "':'": completeIfInTag,
            "Ctrl-Space": "autocomplete"
        };

    function getHintOptionsForRouteXml() {
        let tags = Object.assign({},
            Entaxy.getEntaxyTags(),
            Entaxy.getCamelBlueprintTags(),
            Entaxy.getBlueprintEntaxyTags(),
            ...Entaxy.getEntaxyLibrariesTagList());
        let hintOptions = { schemaInfo: tags };
        return hintOptions;
    }
    Entaxy.getHintOptionsForRouteXml = getHintOptionsForRouteXml;

    function getExtraKeys() {
        return extraKeys;
    }
    Entaxy.getExtraKeys = getExtraKeys;

})(Entaxy || (Entaxy = {}));
