/*
 * Copyright 2015-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.
 */

(function () {
    'use strict';

    var modules = [
            'ngRoute',
            'ngResource',
            'ngAnimate',
            'cordMast',
            'cordFoot',
            'cordNav'
        ],
        viewIds = [
            'login',
            'home',
            'user',
            'bundle'
        ],
        viewDependencies = [],
        dependencies;

    function capitalize(word) {
        return word ? word[0].toUpperCase() + word.slice(1) : word;
    }

    viewIds.forEach(function (id) {
        if (id) {
            viewDependencies.push('cord' + capitalize(id));
        }
    });

    dependencies = modules.concat(viewDependencies);

    angular.module('cordGui', dependencies)
        .config(['$routeProvider', function ($routeProvider) {
            $routeProvider
                .otherwise({
                    redirectTo: '/login'
                });

            function viewCtrlName(vid) {
                return 'Cord' + capitalize(vid) + 'Ctrl';
            }

            function viewTemplateUrl(vid) {
                return 'app/view/' + vid + '/' + vid + '.html';
            }

            viewIds.forEach(function (vid) {
                if (vid) {
                    $routeProvider.when('/' + vid, {
                        controller: viewCtrlName(vid),
                        controllerAs: 'ctrl',
                        templateUrl: viewTemplateUrl(vid)
                    });
                }
            });
        }])
        .controller('CordCtrl', ['$scope', '$location',
            function ($scope, $location) {
                $scope.shared = {
                    url: 'http://' + $location.host() + ':' + $location.port(),
                    userActivity: {}
                };
                $scope.page = {};
            }]);
}());
