text: /*
   * 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.
   */
  import angular from "angular";
  import ngAnimate from 'angular-animate';
  import ngResource from "angular-resource";
  import ngCookies from "angular-cookies";
  import uiRouter from "angular-ui-router";
  import "angular-ui-router/release/stateEvents";
  import ngClipboard from "ngclipboard";
  
  import brCore from 'brooklyn-ui-utils/br-core/br-core';
  
  import brDragndrop from "brooklyn-ui-utils/dragndrop/dragndrop.directive.js"
  import brServerStatus from 'brooklyn-ui-utils/server-status/server-status';
  import brAutoFocus from 'brooklyn-ui-utils/autofocus/autofocus';
  import brIconGenerator from 'brooklyn-ui-utils/icon-generator/icon-generator';
  import brInterstitialSpinner from 'brooklyn-ui-utils/interstitial-spinner/interstitial-spinner';
  import brooklynModuleLinks from 'brooklyn-ui-utils/module-links/module-links';
  import brooklynUserManagement from 'brooklyn-ui-utils/user-management/user-management';
  import brYamlEditor from 'brooklyn-ui-utils/yaml-editor/yaml-editor';
  import brUtils from 'brooklyn-ui-utils/utils/general';
  
  import brSpecEditor from './components/spec-editor/spec-editor.directive';
  import brooklynCatalogSaver from './components/catalog-saver/catalog-saver.directive';
  import paletteApiProvider from "./components/providers/palette-api.provider";
  import paletteServiceProvider from "./components/providers/palette-service.provider";
  import blueprintLoaderApiProvider from "./components/providers/blueprint-loader-api.provider";
  
  import brooklynApi from "brooklyn-ui-utils/brooklyn.api/brooklyn.api";
  import designer from './components/designer/designer.directive';
  import catalogSelector from './components/catalog-selector/catalog-selector.directive';
  import customActionDirective from "./components/custom-action/custom-action.directive";
  import customConfigSuggestionDropdown from "./components/custom-config-widget/suggestion-dropdown";
  import breadcrumbs from "./components/breacrumbs/breadcrumbs.directive";
  import objectCache from './components/factories/object-cache.factory';
  import entityFilters from "./components/filters/entity.filter";
  import locationFilter from "./components/filters/locations.filter";
  import blueprintService from "./components/providers/blueprint-service.provider";
  import recentlyUsedService from "./components/providers/recently-used-service.provider";
  import dslService from "./components/providers/dsl-service.provider";
  import paletteDragAndDropService from "./components/providers/palette-dragndrop.provider";
  import actionService from "./components/providers/action-service.provider";
  import tabService from "./components/providers/tab-service.provider";
  import composerOverrides from "./components/providers/composer-overrides.provider";
  import {mainState} from "./views/main/main.controller";
  import {yamlAutodetectState, yamlCampState, yamlState} from "./views/main/yaml/yaml.state";
  import {graphicalState} from "./views/main/graphical/graphical.state";
  import {graphicalEditState} from "./views/main/graphical/edit/edit.controller";
  import {graphicalEditAddState} from "./views/main/graphical/edit/add/add";
  import {graphicalEditEntityState} from "./views/main/graphical/edit/entity/edit.entity.controller";
  import {graphicalEditPolicyState} from "./views/main/graphical/edit/policy/edit.policy.controller";
  import {graphicalEditEnricherState} from "./views/main/graphical/edit/enricher/edit.enricher.controller";
  import {graphicalEditSpecState} from "./views/main/graphical/edit/spec/edit.spec.controller";
  import {graphicalEditDslState, dslParamLabelFilter} from "./views/main/graphical/edit/dsl/edit.dsl.controller";
  import bottomSheet from "brooklyn-ui-utils/bottom-sheet/bottom-sheet";
  import stackViewer from 'angular-java-stack-viewer';
  import {EntityFamily} from "./components/util/model/entity.model";
  import scriptTagDecorator from 'brooklyn-ui-utils/script-tag-non-overwrite/script-tag-non-overwrite';
  
  import brandAngularJs from 'brand-angular-js';
  
  const IS_PRODUCTION = process.env.NODE_ENV === 'production' || false;
  
  angular.module('brooklynBlueprintComposer', [ngAnimate, ngResource, ngCookies, ngClipboard, uiRouter, 'ui.router.state.events', brCore,
      brServerStatus, brAutoFocus, brIconGenerator, brInterstitialSpinner, brooklynModuleLinks, brooklynUserManagement,
      brYamlEditor, brUtils, brSpecEditor, brooklynCatalogSaver, brooklynApi, bottomSheet, stackViewer, brDragndrop,
      customActionDirective, customConfigSuggestionDropdown, paletteApiProvider, paletteServiceProvider, blueprintLoaderApiProvider,
      breadcrumbs, catalogSelector, designer, objectCache, entityFilters, locationFilter, actionService, tabService, composerOverrides, blueprintService,
      dslService, paletteDragAndDropService, recentlyUsedService, scriptTagDecorator, brandAngularJs])
      .filter('dslParamLabel', ['$filter', dslParamLabelFilter])
      .config(['$urlRouterProvider', '$stateProvider', '$logProvider', '$compileProvider', applicationConfig])
      .config(['actionServiceProvider', actionConfig])
      .config(['tabServiceProvider', 'composerOverridesProvider', tabConfig])
      .config(['paletteServiceProvider', paletteConfig])
      .run(['$rootScope', '$state', 'brSnackbar', errorHandler])
      .run(['$http', httpConfig]);
  
  function applicationConfig($urlRouterProvider, $stateProvider, $logProvider, $compileProvider) {
      $logProvider.debugEnabled(!IS_PRODUCTION);
      $compileProvider.debugInfoEnabled(!IS_PRODUCTION);
      $urlRouterProvider
          .otherwise(graphicalState.url);
      $stateProvider
          .state(mainState)
          .state(yamlAutodetectState)
          .state(yamlCampState)
          .state(graphicalState)
          .state(graphicalEditAddState)
          .state(graphicalEditState)
          .state(graphicalEditEntityState)
          .state(graphicalEditPolicyState)
          .state(graphicalEditEnricherState)
          .state(graphicalEditSpecState)
          .state(graphicalEditDslState);
  }
  
  function actionConfig(actionServiceProvider) {
      actionServiceProvider.addAction("deploy", {html: '<button class="btn btn-outline btn-success" ng-click="vm.deployApplication()" ng-disabled="vm.deploying">Deploy</button>'});
      actionServiceProvider.addAction("add", {html: '<catalog-saver config="vm.saveToCatalogConfig"></catalog-saver>'});
  }
  
  function tabConfig(tabServiceProvider, composerOverridesProvider) {
      tabServiceProvider.addTab('graphical', {
          title: 'Graphical Designer',
          icon: 'fa-object-group',
          stateKey: 'main.graphical'
      });
      tabServiceProvider.addTab('yaml', {
          title: 'YAML Editor',
          icon: 'fa-pencil',
          stateKey: 'main.yaml_camp',
      });
  
      (composerOverridesProvider.$get().tabServiceProviderCustomization || (()=>{}))(tabServiceProvider);
  }
  
  function paletteConfig(paletteServiceProvider) {
      paletteServiceProvider.addSection('entities', {
          title: 'Entities',
          type: EntityFamily.ENTITY,
          icon: 'fa-square-o'
      });
      paletteServiceProvider.addSection('policies', {
          title: 'Policies',
          type: EntityFamily.POLICY,
          icon: 'fa-heartbeat'
      });
      paletteServiceProvider.addSection('enrichers', {
          title: 'Enrichers',
          type: EntityFamily.ENRICHER,
          icon: 'fa-puzzle-piece'
      });
      paletteServiceProvider.addSection('locations', {
          title: 'Locations',
          type: EntityFamily.LOCATION,
          icon: 'fa-map-pin'
      });
  }
  
  function errorHandler($rootScope, $state, brSnackbar) {
      $rootScope.$on('$stateChangeError', (event, toState, toParams, fromState, fromParams, error) => {
          brSnackbar.create(error.detail);
          if (toState && toState.name && toState.name.startsWith(yamlAutodetectState.name)) {
              $state.go(toState);
          } else {
              $state.go(graphicalState);
          }
      });
  }
  
  function httpConfig($http) {
      $http.defaults.headers.common['X-Csrf-Token-Required-For-Requests'] = 'write';
  }
  