/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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.
 */

/*
 ONOS GUI -- View Controller.
 A base class for view controllers to extend from
 */

(function () {
    'use strict';

    var flash, ps;

    function ViewController(options) {
        this.initialize.apply(this, arguments);
    }

    ViewController.prototype = {

        id: null,
        displayName: 'View',

        initialize: function () {
            this.name = this.displayName.toLowerCase().replace(/ /g, '_');
            this.prefs = {
                visible: this.name + '_visible',
            };
        },
        appendElement: function (parent, node) {
            var el = d3.select('#' + this.id);
            if (el.empty()) {
                 return d3.select(parent).append(node).attr('id', this.id);
            }
            return el;
        },
        node: function () {
            return d3.select('#' + this.id);
        },
        enabled: function () {
            return ps.getPrefs('topo2_prefs')[this.prefs.visible];
        },
        isVisible: function () {
            return this.node().style('visibility') === 'visible';
        },
        hide: function () {
            var node = this.node();

            if (this.isVisible()) {
                node
                    .transition()
                    .duration(400)
                    .style('opacity', 0)
                    .each('end', function () {
                        node.style('visibility', 'hidden');
                    });
            }
        },
        show: function () {
            var node = this.node();

            if (!this.isVisible()) {
                node
                    .style('visibility', 'visible')
                    .transition()
                    .duration(400)
                    .style('opacity', 1);
            }
        },
        toggle: function () {
            var on = !Boolean(this.isVisible()),
                verb = on ? 'Show' : 'Hide';

            on ? this.show() : this.hide();
            flash.flash(verb + ' ' + this.displayName);
            this.updatePrefState(this.prefs.visible, on);
        },
        lookupPrefState: function (key) {
            // Return 0 if not defined
            return ps.getPrefs('topo2_prefs')[key] || 0;
        },
        updatePrefState: function (key, value) {
            var state = ps.getPrefs('topo2_prefs');
            state[key] = value ? 1 : 0;
            ps.setPrefs('topo2_prefs', state);
        },
    };

    angular.module('ovTopo2')
        .factory('Topo2ViewController', [
            'FnService', 'FlashService', 'PrefsService',
            function (fn, _flash_, _ps_) {

                flash = _flash_;
                ps = _ps_;

                ViewController.extend = fn.extend;
                return ViewController;
            },
        ]);
})();
