/*
 * Copyright 2015-present Open Networking Foundation
 *
 * 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 -- Navigation Module
 */
(function () {
    'use strict';

    // injected dependencies
    var $log, $location, $window, fs;

    // internal state
    var navShown = false;
    var ovParamsDataNs = {};

    function updatePane() {
        var vis = navShown ? 'visible' : 'hidden';
        d3.select('#nav').style('visibility', vis);
    }

    function showNav() {
        navShown = true;
        updatePane();
    }
    function hideNav() {
        navShown = false;
        updatePane();
    }
    function toggleNav() {
        navShown = !navShown;
        updatePane();
    }
    function hideIfShown() {
        if (navShown) {
            hideNav();
            return true;
        }
        return false;
    }

    function isEmpty(obj) {
        for (var x in obj) { return false; }
        return true;
    }

    function navTo(path, params) {

        var url;
        if (params.hasOwnProperty('ovParams') && !isEmpty(params.ovParams) ) {
            ovParamsDataNs = params.ovParams;
            delete params.ovParams;
        }

        if (!path) {
            $log.warn('Not a valid navigation path');
            return null;
        }
        $location.url('/' + path);

        if (fs.isO(params)) {
            $location.search(params);
        } else if (params !== undefined) {
            $log.warn('Query params not an object', params);
        }

        url = $location.absUrl();
        $log.log('Navigating to ', url);
        $window.location.href = url;

    }

    function getOvParamsData() {
        return ovParamsDataNs;
    }

    angular.module('onosNav', [])
        .controller('NavCtrl', ['$log',

            function (_$log_) {
                var self = this;
                $log = _$log_;

                self.hideNav = hideNav;
                $log.log('NavCtrl has been created');
            },
        ])
        .factory('NavService',
            ['$log', '$location', '$window', 'FnService',

            function (_$log_, _$location_, _$window_, _fs_ ) {
                $log = _$log_;
                $location = _$location_;
                $window = _$window_;
                fs = _fs_;


                return {
                    showNav: showNav,
                    hideNav: hideNav,
                    toggleNav: toggleNav,
                    hideIfShown: hideIfShown,
                    navTo: navTo,
                    navPassedData: getOvParamsData,
                };
        }]);

}());
