<script>
    /**
    * @ngdoc overview
    * @name templateAdminApp
    * @description
    * # templateAdminApp
    * Main module of the application.
    */
    angular
    .module('<%= module %>', [
      'ngAnimate',
      'ngMessages',
      'ngResource',
      'ngSanitize',
      'ui.router',
      'formly'
      /*Adding the runtime modules added from plugins*/
      <% for (var angularModules in moduleDependencies) {
        if (moduleDependencies.hasOwnProperty(angularModules)) { %>
          ,'<%= moduleDependencies[angularModules] %>'
        <%}
      }%>
    ]);


    //Defining a gloabl protected method for client side global objects and settings...
    var $snaphy = (function(){

        var moduleName = '<%= module %>',
        //Global objects for adding settings..
        pluginSettings = {},

        //Set true if default template is to be shown
        template = true,

        /**
         * Return the name of main Angularjs module name.
         */
        getModuleName  = function(){
            return moduleName;
        },

        getDefaultTemplate = function(){
            return template;
        },

        //Set the default template value..
        setDefaultTemplate = function(templateValue){
            template = templateValue;
        },

        //Add settings file..
        addSettings = function(pluginName, settingsObj){
            pluginSettings[pluginName] = settingsObj;
        },

        //For loading the whole plugin settings..
        loadSettings = function(pluginName, propName){
            if(arguments.length === 1){
                //Return the whole plugin setting in this case..
                return pluginSettings[pluginName];
            }
            else if(arguments.length === 2){
                var pluginObj = pluginSettings[pluginName];
                return pluginObj[propName];
            }
            else{
                /*Do nothing*/
                return null;
            }
        };


        //Now exposing the required methods only..
        return {
            getModuleName: getModuleName,
            getDefaultTemplate: getDefaultTemplate,
            setDefaultTemplate: setDefaultTemplate,
            addSettings: addSettings,
            loadSettings : loadSettings
        }

    })();//$snaphy function..

    //Now set the value of the $snaphy..
    //var $snaphy = $snaphy_();


    angular.module($snaphy.getModuleName())

        //Contains all the setting written for template settings..
        .factory("TemplateSettings", [function(){
            var settings = <%- JSON.stringify(templateSettings)%>;
            return settings;
        }])


    //Define a service for fetching database..
    .factory('Database', ['$injector', function($injector){
        //Contain plugin name with the database object..
        /**
         * Object in the format of {pluginName: {DatabaseName: databaseRealMapName} }
         * */
        var mapDatabase = {
            <% include ./mapDatabase %>
        }; //mapDatabase




        /**
         * Get the defined database and returns the map database service.
         * @param pluginName
         * @param databaseName
         * @returns {*} return the database REST defined service object.
         */
        var getDatabase = function(pluginName, databaseName){
            var pluginObj = mapDatabase[pluginName];
            var service = pluginObj[databaseName];
            return $injector.get(service);
        };


        var loadDatabase = function(databaseName){
            return $injector.get(databaseName);
        };

        return{
            getDb: getDatabase,
            loadDb: loadDatabase
        };
    }]);//factory database..


</script>
