/*
 * 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 -- Topology SubRegion Module.
 Module that holds the sub-regions for a region
 */

(function () {
    'use strict';

    var Collection, Model;

    var remappedDeviceTypes = {
        virtual: 'cord'
    };

    function createSubRegionCollection(data, region) {

        var SubRegionCollection = Collection.extend({
            model: Model,
            region: region
        });

        return new SubRegionCollection(data);
    }

    angular.module('ovTopo2')
    .factory('Topo2SubRegionService', [
        'WebSocketService', 'Topo2Collection', 'Topo2NodeModel',
        'Topo2SubRegionPanelService',

        function (wss, _c_, NodeModel, t2srp) {

            Collection = _c_;

            Model = NodeModel.extend({
                initialize: function () {
                    this.super = this.constructor.__super__;
                    this.super.initialize.apply(this, arguments);
                },
                events: {
                    'dblclick': 'navigateToRegion',
                    'click': 'onClick'
                },
                onChange: function () {
                    // Update class names when the model changes
                    if (this.el) {
                        this.el.attr('class', this.svgClassName());
                    }
                },
                nodeType: 'sub-region',
                icon: function () {
                    var type = this.get('type');
                    return remappedDeviceTypes[type] || type || 'm_cloud';
                },
                onClick: function () {
                    var selected = this.select(d3.event);

                    if (selected.length > 0) {
                        t2srp.displayPanel(this);
                    } else {
                        t2srp.hide();
                    }
                },
                navigateToRegion: function () {

                    if (d3.event.defaultPrevented) return;

                    wss.sendEvent('topo2navRegion', {
                        dir: 'down',
                        rid: this.get('id')
                    });

                    var layout = this.collection.region.layout;
                    layout.createForceElements();
                    layout.transitionDownRegion();

                    t2srp.hide();
                }
            });

            return {
                createSubRegionCollection: createSubRegionCollection
            };
        }
    ]);

})();
