class ConsulKeysManager extends ConsulUIManager {
    constructor(resourceURL) {
        super(resourceURL);
        this.codeDisplayer = new CodeDisplayer(
            $("#kv-data"),
            $("#kv-title"),
        )
        this.sideSelector = new KeySideSelector(
            this.codeDisplayer,
            $("#keys-filter"),
            $("#keys-list"),
            $("#keys-counter"),
            "filter",
            "key"
        );
        this.fetchResource();
    }

    async initResource(data) {
        this.sideSelector.data = data["kv"];
        this.sideSelector.prepareData();
        this.sideSelector.refreshList();
    }

    async clean() {
        this.sideSelector.data = {};
    }
}

class KeySideSelector extends SideSelector {
    constructor(
        codeDisplayer,
        filterElement,
        listElement,
        counterElement,
        URLLabelFilter,
        URLLabelSelected
    ) {
        super(
            filterElement,
            listElement,
            counterElement,
            URLLabelFilter,
            URLLabelSelected,
            false
        );
        this.codeDisplayer = codeDisplayer
    }

    matchElement(key, keyData, filter) {
        return key.match(filter);
    }

    elementGenerator(key, data) {
        var element = document.createElement("li");

        var CSSClass = "service-list-item list-group-item list-group-item-action";

        var obj = this;
        element.addEventListener("focus", function () {
            obj.onClickElement(this, key);
        });
        element.addEventListener("click", function () {
            obj.onClickElement(this, key);
        });

        element.setAttribute("value", key);

        element.setAttribute("class", CSSClass);

        var nameItem = document.createElement("div");
        nameItem.setAttribute("class", "service-name");
        nameItem.appendChild(document.createTextNode(key));
        element.appendChild(nameItem);

        return element;
    }

    selectItem(element, key) {
        super.selectItem(element, key);
        if (this.data[key] != null) {
            var dataToDisplay = atob(this.data[key]);
        } else {
            var dataToDisplay = 'NO DATA';
        }
        this.codeDisplayer.displayData(key, dataToDisplay);
    }
}


$(window).resize(resizeData);
resizeData();