(function () {
    'use-strict';

    var instance;

    // TODO: Commented k2b map and addToggles are not implement in Topo2 yet.

    // key to button mapping data
    var k2b = {
        O: { id: 'topo2-summary-tog', gid: 'm_summary', isel: true},
        I: { id: 'topo2-instance-tog', gid: 'm_uiAttached', isel: true },
        // D: { id: 'details-tog', gid: 'm_details', isel: true },
        // H: { id: 'hosts-tog', gid: 'm_endstation', isel: false },
        // M: { id: 'offline-tog', gid: 'm_switch', isel: true },
        P: { id: 'topo2-ports-tog', gid: 'm_ports', isel: true },
        B: { id: 'topo2-bkgrnd-tog', gid: 'm_map', isel: true },

        // Z: { id: 'oblique-tog', gid: 'm_oblique', isel: false },
        // N: { id: 'filters-btn', gid: 'm_filters' },
        L: { id: 'topo2-cycleLabels-btn', gid: 'm_cycleLabels' },
        R: { id: 'topo2-resetZoom-btn', gid: 'm_resetZoom' },

        E: { id: 'topo2-eqMaster-btn', gid: 'm_eqMaster' }
    };

    angular.module('ovTopo2')
        .factory('Topo2ToolbarService', [
            'FnService', 'ToolbarService', 'Topo2KeyCommandService',
            function (fs, tbs, t2kcs) {

                var Toolbar = function () {
                    instance = this;
                    this.el = tbs.createToolbar(this.className);
                };

                Toolbar.prototype = {

                    className: 'topo2-toolbar',

                    init: function () {
                        this.initKeyData();
                        this.addFirstRow();
                        this.el.addRow();
                        this.addSecondRow();

                        this.el.hide();
                    },
                    initKeyData: function () {
                        _.each(k2b, function(value, key) {
                            var data = t2kcs.getActionEntry(key);
                            if (data) {
                                value.cb = data[0];                     // on-click callback
                                value.tt = data[1] + ' (' + key + ')';  // tooltip
                            }
                        });
                    },
                    getKey: function (key) {
                        return k2b[key];
                    },
                    keyListener: function (key) {
                        var v = this.getKey(key);

                        if (v && v.tog) {
                            v.tog.toggleNoCb();
                        }
                    },
                    addButton: function (key) {
                        var v =  this.getKey(key);
                        v.btn = this.el.addButton(v.id, v.gid, v.cb, v.tt);
                    },
                    addToggle: function (key, suppressIfMobile) {
                        var v =  this.getKey(key);
                        if (suppressIfMobile && fs.isMobile()) { return; }
                        v.tog = this.el.addToggle(v.id, v.gid, v.isel, v.cb, v.tt);
                    },

                    toggle: function () {
                        this.el.toggle();
                    },

                    addFirstRow: function () {
                        this.addToggle('I');
                        this.addToggle('O');
                        // this.addToggle('D');
                        this.el.addSeparator();

                        // this.addToggle('H');
                        // this.addToggle('M');
                        this.addToggle('P', true);
                        this.addToggle('B');
                    },
                    addSecondRow: function () {
                        //addToggle('X');
                        // this.addToggle('Z');
                        // this.addButton('N');
                        this.addButton('L');
                        this.addButton('R');
                        this.el.addSeparator();
                        this.addButton('E');
                    },

                    destroy: function () {
                        // TODO: Should the tbs remove button id's in the destroyToolbar method?
                        // If you go topo2 -> topo -> topo2 there's a button id conflict
                        tbs.destroyToolbar(this.className);
                    }
                };

                return instance || new Toolbar();
            }
        ]);
})();