text: 'use strict';
  
  //Menu service used for managing  menus
  angular.module(ApplicationConfiguration.applicationModuleName).service('Menus', [
    function () {
  
      // Define the menus object
      this.menus = {};
  
      // Validate menu existance
      this.validateMenuExistance = function (menuId) {
        if (menuId && menuId.length) {
          if (this.menus[menuId]) {
            return true;
          } else {
            throw new Error('Menu does not exist');
          }
        } else {
          throw new Error('MenuId was not provided');
        }
  
        return false;
      };
  
      // Get the menu object by menu id
      this.getMenu = function (menuId) {
        // Validate that the menu exists
        this.validateMenuExistance(menuId);
  
        // Return the menu object
        return this.menus[menuId];
      };
  
      // Add new menu object by menu id
      this.addMenu = function (menuId, options) {
        options = options || {};
  
        // Create the new menu
        this.menus[menuId] = {
          roles: options.roles || this.defaultRoles,
          items: options.items || []
        };
  
        // Return the menu object
        return this.menus[menuId];
      };
  
      // Remove existing menu object by menu id
      this.removeMenu = function (menuId) {
        // Validate that the menu exists
        this.validateMenuExistance(menuId);
  
        // Return the menu object
        delete this.menus[menuId];
      };
  
      // Add menu item object
      this.addMenuItem = function (menuId, options) {
        options = options || {};
  
        // Validate that the menu exists
        this.validateMenuExistance(menuId);
  
        // Push new menu item
        this.menus[menuId].items.push({
          title: options.title || '',
          state: options.state || '',
          type: options.type || 'item',
          class: options.class,
          roles: ((options.roles === null || typeof options.roles === 'undefined') ? this.defaultRoles : options.roles),
          position: options.position || 0,
          items: []
        });
  
        // Add submenu items
        if (options.items) {
          for (var i in options.items) {
            this.addSubMenuItem(menuId, options.state, options.items[i]);
          }
        }
  
        // Return the menu object
        return this.menus[menuId];
      };
  
      // Add submenu item object
      this.addSubMenuItem = function (menuId, parentItemState, options) {
        options = options || {};
  
        // Validate that the menu exists
        this.validateMenuExistance(menuId);
  
        // Search for menu item
        for (var itemIndex in this.menus[menuId].items) {
          if (this.menus[menuId].items[itemIndex].state === parentItemState) {
            // Push new submenu item
            this.menus[menuId].items[itemIndex].items.push({
              title: options.title || '',
              state: options.state || '',
              roles: ((options.roles === null || typeof options.roles === 'undefined') ? this.menus[menuId].items[itemIndex].roles : options.roles),
              position: options.position || 0
            });
          }
        }
  
        // Return the menu object
        return this.menus[menuId];
      };
  
      // Remove existing menu object by menu id
      this.removeMenuItem = function (menuId, menuItemState) {
        // Validate that the menu exists
        this.validateMenuExistance(menuId);
  
        // Search for menu item to remove
        for (var itemIndex in this.menus[menuId].items) {
          if (this.menus[menuId].items[itemIndex].state === menuItemState) {
            this.menus[menuId].items.splice(itemIndex, 1);
          }
        }
  
        // Return the menu object
        return this.menus[menuId];
      };
  
      // Remove existing menu object by menu id
      this.removeSubMenuItem = function (menuId, submenuItemState) {
        // Validate that the menu exists
        this.validateMenuExistance(menuId);
  
        // Search for menu item to remove
        for (var itemIndex in this.menus[menuId].items) {
          for (var subitemIndex in this.menus[menuId].items[itemIndex].items) {
            if (this.menus[menuId].items[itemIndex].items[subitemIndex].state === submenuItemState) {
              this.menus[menuId].items[itemIndex].items.splice(subitemIndex, 1);
            }
          }
        }
  
        // Return the menu object
        return this.menus[menuId];
      };
  
      //Adding the topbar menu
      this.addMenu('topbar', {
        roles: ['*']
      });
  
    }
  ]);
  