/*
 * Copyright © 2016-2020 The Thingsboard Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import './kv-map.scss';

/* eslint-disable import/no-unresolved, import/default */

import kvMapTemplate from './kv-map.tpl.html';

/* eslint-enable import/no-unresolved, import/default */

export default angular.module('thingsboard.directives.keyValMap', [])
    .directive('tbKeyValMap', KeyValMap)
    .name;

/*@ngInject*/
function KeyValMap() {
    return {
        restrict: "E",
        scope: true,
        bindToController: {
            disabled:'=ngDisabled',
            titleText: '@?',
            keyPlaceholderText: '@?',
            valuePlaceholderText: '@?',
            noDataText: '@?',
            keyValMap: '='
        },
        controller: KeyValMapController,
        controllerAs: 'vm',
        templateUrl: kvMapTemplate
    };
}

/*@ngInject*/
function KeyValMapController($scope, $mdUtil) {

    let vm = this;

    vm.kvList = [];

    vm.removeKeyVal = removeKeyVal;
    vm.addKeyVal = addKeyVal;

    $scope.$watch('vm.keyValMap', () => {
        stopWatchKvList();
        vm.kvList.length = 0;
        if (vm.keyValMap) {
            for (var property in vm.keyValMap) {
                if (Object.prototype.hasOwnProperty.call(vm.keyValMap, property)) {
                    vm.kvList.push(
                        {
                            key: property + '',
                            value: vm.keyValMap[property]
                        }
                    );
                }
            }
        }
        $mdUtil.nextTick(() => {
            watchKvList();
        });
    });

    function watchKvList() {
        $scope.kvListWatcher = $scope.$watch('vm.kvList', () => {
            if (!vm.keyValMap) {
                return;
            }
            for (var property in vm.keyValMap) {
                if (Object.prototype.hasOwnProperty.call(vm.keyValMap, property)) {
                    delete vm.keyValMap[property];
                }
            }
            for (var i=0;i<vm.kvList.length;i++) {
                var entry = vm.kvList[i];
                vm.keyValMap[entry.key] = entry.value;
            }
        }, true);
    }

    function stopWatchKvList() {
        if ($scope.kvListWatcher) {
            $scope.kvListWatcher();
            $scope.kvListWatcher = null;
        }
    }


    function removeKeyVal(index) {
        if (index > -1) {
            vm.kvList.splice(index, 1);
        }
    }

    function addKeyVal() {
        if (!vm.kvList) {
            vm.kvList = [];
        }
        vm.kvList.push(
            {
                key: '',
                value: ''
            }
        );
    }
}
