/*
 * 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 Map Module.
 Defines behavior for loading geographical maps into the map layer.
 */

(function () {
    'use strict';

    // Injected Services
    var t2zs, countryFilters, ms;

    // internal state
    var instance, zoomer, currentMap;

    function init() {
        this.appendElement('#topo2-background', 'g');
        zoomer = t2zs.getZoomer();
        currentMap = null;
    }

    function setUpMap(mapId, mapFilePath, mapScale) {

        if (currentMap === mapId) {
            return new Promise(function (resolve) {
                resolve();
            });
        }

        currentMap = mapId;

        var loadMap = ms.loadMapInto,
            promise, cfilter;

        this.node().selectAll('*').remove();

        if (mapFilePath === '*countries') {
            cfilter = countryFilters[mapId] || countryFilters.uk;
            loadMap = ms.loadMapRegionInto;
        }

        promise = loadMap(this.node(), mapFilePath, mapId, {
            countryFilters: cfilter,
            adjustScale: mapScale || 1,
            shading: '',
        });

        return promise;
    }


    function resetZoom() {
        zoomer.reset();
    }

    function zoomCallback(sc, tr) {
        // keep the map lines constant width while zooming
        this.node().style('stroke-width', (2.0 / sc) + 'px');
    }

    function getCurrentMap() {
        return currentMap;
    }

    angular.module('ovTopo2')
    .factory('Topo2MapService', [
        'Topo2ZoomService', 'MapService', 'Topo2ViewController',

        function (_t2zs_, _ms_, ViewController) {
            t2zs = _t2zs_;
            ms = _ms_;

            var MapLayer = ViewController.extend({

                id: 'topo2-map',
                displayName: 'Map',

                init: init,
                setUpMap: setUpMap,
                resetZoom: resetZoom,
                zoomCallback: zoomCallback,
                getCurrentMap: getCurrentMap,
            });

            return instance || new MapLayer();
        },
    ]);
})();
