/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
'use strict';

angular.module('dgc', ['ngCookies',
    'ngResource',
    'ui.bootstrap',
    'ui.router',
    'dgc.system',
    'dgc.home',
    'dgc.about',
    'dgc.search',
    'dgc.navigation',
    'dgc.tags',
    'dgc.tags.instance',
    'dgc.tags.definition'
]);

angular.module('dgc.system', ['dgc.system.notification']);

angular.module('dgc').factory('lodash', ['$window',
    function($window) {
        return $window._;
    }
]).factory('d3', ['$window',
    function($window) {
        return $window.d3;
    }
]).factory('Global', ['$window', '$location',
    function($window, $location) {
        return {
            user: $location.search()['user.name'],
            authenticated: !!$window.user,
            renderErrors: $window.renderErrors
        };
    }
]).factory('HttpInterceptor', ['Global', function(Global) {
    return {
        'request': function(config) {
            if (config.url && (config.url.indexOf('api/atlas/') === 0 || config.url.indexOf('/api/atlas/') === 0)) {
                config.params = config.params || {};
                config.params['user.name'] = Global.user;
            }
            return config;
        }
    };
}]).config(['$httpProvider', function($httpProvider) {
    $httpProvider.interceptors.push('HttpInterceptor');
}]).run(['$rootScope', 'Global', 'NotificationService', 'lodash', 'd3', function($rootScope, Global, NotificationService, lodash, d3) {
    var errors = Global.renderErrors;
    if (angular.isArray(errors) || angular.isObject(errors)) {
        lodash.forEach(errors, function(err) {
            err = angular.isObject(err) ? err : {
                message: err
            };
            err.timeout = false;
            NotificationService.error(err);
        });
    } else {
        if (errors) {
            errors.timeout = false;
            NotificationService.error(errors);
        }
    }
    $rootScope.$on('$stateChangeStart', function() {
        d3.selectAll('.d3-tip').remove();
    });

    $rootScope.updateTags = function(added, obj) {
        if (added) {
            $rootScope.$broadcast('add_Tag', obj);
        }
    };

    $rootScope.loadTraits = function() {
        $rootScope.$broadcast('load_Traits');
    };

    $rootScope.$on('$stateChangeSuccess', function(evt, to, toParams, from) {
        if (from.name !== '' && to.name === 'search' && to.name !== from.name && typeof to.parent === 'undefined' && typeof from.parent === 'undefined') {
            $rootScope.loadTraits();
        } else if (from.name === '' && to.name === 'search') {
            $rootScope.loadTraits();
        }

        if (typeof to.parent === 'undefined') {
            if (to.name !== 'search') { 
                $rootScope.leftNav = true;
            } else { 
                $rootScope.leftNav = false;
            }
        }
    });

}]);