/*-
 * ~~~~~~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) {
    Entaxy._module.component('entaxyTreeHeader', {
            template:
                `<div class="tree-nav-sidebar-header">
                  <form role="form" class="search-pf has-button">
                    <div class="form-group has-clear">
                      <div class="search-pf-input-group">
                        <label for="input-search" class="sr-only">Search Tree:</label>
                        <input id="input-search" type="search" class="form-control" placeholder="Search tree:"
                          ng-model="$ctrl.filter">
                        <button type="button" class="clear" aria-hidden="true"
                          ng-hide="$ctrl.filter.length === 0"
                          ng-click="$ctrl.filter = ''">
                          <span class="pficon pficon-close"></span>
                        </button>
                      </div>
                    </div>
                    <div class="form-group tree-nav-buttons">
                      <span class="badge" ng-class="{positive: $ctrl.result.length > 0}"
                        ng-show="$ctrl.filter.length > 0">
                        {{$ctrl.result.length}}
                      </span>
                      <i class="fa fa-plus-square-o" title="Expand All" ng-click="$ctrl.expandAll()"></i>
                      <i class="fa fa-minus-square-o" title="Collapse All" ng-click="$ctrl.contractAll()"></i>
                    </div>
                  </form>
                </div>
            `,
            controller: EntaxyTreeHeaderController
        })
        .component('entaxyTree', {
              template:
              `<div class="tree-nav-sidebar-content">
                  <div id="entaxytree" class="treeview-pf-hover treeview-pf-select"></div>
              </div>
              `,
              controller: EntaxyTreeController
        })
        .name;
    entaxyTreeElementId = '#entaxytree';
    Entaxy.log.debug("loaded tree" + Entaxy.treeModule);


    function EntaxyTreeHeaderController($scope, $element) {
        'ngInject';
        Entaxy.log.debug("EntaxyTreeHeaderController ");
        this.$scope = $scope;
        this.$element = $element;
        this.filter = '';
        this.result = [];
        // it's not possible to declare classes to the component host tag in AngularJS
        $element.addClass('tree-nav-sidebar-header');

        EntaxyTreeHeaderController.prototype.$onInit = function () {
            Entaxy.log.debug("EntaxyTreeHeaderController init");
            var _this = this;
            this.$scope.$watch(angular.bind(this, function () { return _this.filter; }), function (filter, previous) {
                if (filter !== previous) {
                    _this.search(filter);
                }
            });
        };

        EntaxyTreeHeaderController.prototype.search = function (filter) {
            Entaxy.log.debug("EntaxyTreeHeaderController search");
            var _this = this;
            var doSearch = function (filter) {
                var result = _this.tree().search(filter, {
                    ignoreCase: true,
                    exactMatch: false,
                    revealResults: true
                });
                _this.result.length = 0;
                (_a = _this.result).push.apply(_a, result);
                Core.$apply(_this.$scope);
                var _a;
            };
            _.debounce(doSearch, 300, { leading: false, trailing: true })(filter);
        };

        EntaxyTreeHeaderController.prototype.tree = function () {
            Entaxy.log.debug("EntaxyTreeHeaderController tree");
            return $(entaxyTreeElementId).treeview(true);
        };

        EntaxyTreeHeaderController.prototype.expandAll = function () {
            Entaxy.log.debug("EntaxyTreeHeaderController expand");
            return this.tree()
                .expandNode(this.tree().getNodes(), { levels: HawtioTree.getMaxTreeLevel(this.tree()), silent: true });
        };

        EntaxyTreeHeaderController.prototype.contractAll = function () {
            Entaxy.log.debug("EntaxyTreeHeaderController contract");
            return this.tree()
                .collapseNode(this.tree().getNodes(), { ignoreChildren: true, silent: true });
        };
    }
    EntaxyTreeHeaderController.$inject = ['$scope', '$element'];

    function EntaxyTreeController($scope, $location, workspace, $element) {
        'ngInject';
        this.$scope = $scope;
        this.$location = $location;
        this.workspace = workspace;
        this.$element = $element;
        // it's not possible to declare classes to the component host tag in AngularJS
        $element.addClass('tree-nav-sidebar-content');
        Entaxy.log.debug("EntaxyTreeController ");
        var entaxyJmxDomain = localStorage['entaxyJmxDomain'] || "ru.entaxy.esb";
        EntaxyTreeController.prototype.$onInit = function () {
            Entaxy.log.debug("EntaxyTreeController onInit");
            var _this = this;
            this.$scope.$on('$destroy', function () { return _this.removeTree(); });
            this.$scope.$on('$routeChangeStart', function () { return Jmx.updateTreeSelectionFromURL(_this.$location, $(entaxyTreeElementId)); });
            this.$scope.$on('jmxTreeUpdated', function () { return _this.populateTree(); });
            this.populateTree();
        };
        EntaxyTreeController.prototype.updateSelectionFromURL = function () {
            Jmx.updateTreeSelectionFromURLAndAutoSelect(this.$location, $(entaxyTreeElementId), function (first) {
                if (first.children == null) {
                    return null;
                }
                // use function to auto select the queue folder on the 1st broker
                var queues = first.children[0];
                if (queues && queues.text === 'Queue') {
                    return queues;
                }
                return null;
            }, true);
        };
        EntaxyTreeController.prototype.populateTree = function () {
            var _this = this;
            var children = [];
            var tree = this.workspace.tree;
            Entaxy.log.debug("tree = " + tree);
            if (tree) {
                var domainName = entaxyJmxDomain;
                var folder = tree.get(domainName);

                if (folder) {
                    children = folder.children;
                }
                angular.forEach(children,  function(child) {
                    Entaxy.log.debug("child = " + child.text + " " + child.id);
                });
                var treeElement = $("#entaxytree");
                this.removeTree();
                Jmx.enableTree(this.$scope, this.$location, this.workspace, $(entaxyTreeElementId), children);
                this.updateSelectionFromURL();
            }
        };
        EntaxyTreeController.prototype.removeTree = function () {
            var tree = $(entaxyTreeElementId).treeview(true);
            // There is no exposed API to check whether the tree has already been initialized,
            // so let's just check if the methods are presents
            if (tree.clearSearch) {
                tree.clearSearch();
                // Bootstrap tree view leaks the node elements into the data structure
                // so let's clean this up when the user leaves the view
                var cleanTreeFolder_1 = function (node) {
                    delete node['$el'];
                    if (node.nodes)
                        node.nodes.forEach(cleanTreeFolder_1);
                };
                cleanTreeFolder_1(this.workspace.tree);
                // Then call the tree clean-up method
                tree.remove();
            }
        }
    }
    EntaxyTreeController.$inject = ['$scope', '$location', 'workspace', '$element'];

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