/*
 * 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 _ from 'lodash';

import './style.scss';

import './vendor';
import '../public/stylesheets/style.scss';
import '../app/primitives';

import './app.config';

import './modules/form/form.module';
import './modules/agent/agent.module';
import './modules/nodes/nodes.module';
import './modules/demo/Demo.module';

import './modules/states/logout.state';
import './modules/states/admin.state';
import './modules/states/errors.state';
import './modules/states/settings.state';
// ignite:modules
import './core';
import './modules/user/user.module';
import './modules/branding/branding.module';
import './modules/navbar/navbar.module';
import './modules/getting-started/GettingStarted.provider';
import './modules/dialog/dialog.module';
import './modules/ace.module';
import './modules/loading/loading.module';
import servicesModule from './services';
import igniteServices from './services';
// Data
import i18n from './data/i18n';
// Directives.
import igniteAutoFocus from './directives/auto-focus.directive';
import igniteCopyToClipboard from './directives/copy-to-clipboard.directive';
import igniteHideOnStateChange from './directives/hide-on-state-change/hide-on-state-change.directive';
import igniteMatch from './directives/match.directive';
import igniteOnClickFocus from './directives/on-click-focus.directive';
import igniteOnEnter from './directives/on-enter.directive';
import igniteOnEnterFocusMove from './directives/on-enter-focus-move.directive';
import igniteOnEscape from './directives/on-escape.directive';
import igniteOnFocusOut from './directives/on-focus-out.directive';
import igniteRetainSelection from './directives/retain-selection.directive';
import btnIgniteLink from './directives/btn-ignite-link';
// Services.
import ChartColors from './services/ChartColors.service';
import {Confirm, default as IgniteConfirm} from './services/Confirm.service';
import ConfirmBatch from './services/ConfirmBatch.service';
import CopyToClipboard from './services/CopyToClipboard.service';
import Countries from './services/Countries.service';
import ErrorPopover from './services/ErrorPopover.service';
import Focus from './services/Focus.service';
import FormUtils from './services/FormUtils.service';
import InetAddress from './services/InetAddress.service';
import JavaTypes from './services/JavaTypes.service';
import SqlTypes from './services/SqlTypes.service';
import LegacyTable from './services/LegacyTable.service';
import LegacyUtils from './services/LegacyUtils.service';
import Messages from './services/Messages.service';
import ErrorParser from './services/ErrorParser.service';
import ModelNormalizer from './services/ModelNormalizer.service';
import {CSV} from './services/CSV';
import {$exceptionHandler} from './services/exceptionHandler';

import {Store} from './services/store';

import AngularStrapTooltip from './services/AngularStrapTooltip.decorator';
import AngularStrapSelect from './services/AngularStrapSelect.decorator';
// Filters.
import byName from './filters/byName.filter';
import bytes from './filters/bytes.filter';
import defaultName from './filters/default-name.filter';
import domainsValidation from './filters/domainsValidation.filter';
import duration from './filters/duration.filter';
import hasPojo from './filters/hasPojo.filter';
import uiGridSubcategories from './filters/uiGridSubcategories.filter';
import id8 from './filters/id8.filter';
// Components
import igniteListOfRegisteredUsers from './components/list-of-registered-users';
import dialogAdminCreateUser from './components/dialog-admin-create-user';
import IgniteActivitiesUserDialog from './components/activities-user-dialog';
import './components/input-dialog';
import webConsoleHeader from './components/web-console-header';
import webConsoleFooter from './components/web-console-footer';
import igniteIcon from './components/ignite-icon';
import versionPicker from './components/version-picker';
import userNotifications from './components/user-notifications';
import pageAdmin from './components/page-admin';
import pageQueries from './components/page-queries';
import gridColumnSelector from './components/grid-column-selector';
import gridItemSelected from './components/grid-item-selected';
import gridNoData from './components/grid-no-data';
import gridExport from './components/grid-export';
import gridShowingRows from './components/grid-showing-rows';
import bsSelectMenu from './components/bs-select-menu';
import protectFromBsSelectRender from './components/protect-from-bs-select-render';
import uiGrid from './components/ui-grid';
import uiGridHovering from './components/ui-grid-hovering';
import uiGridFilters from './components/ui-grid-filters';
import uiGridColumnResizer from './components/ui-grid-column-resizer';
import listEditable from './components/list-editable';
import breadcrumbs from './components/breadcrumbs';
import panelCollapsible from './components/panel-collapsible';
import clusterSelector from './components/cluster-selector';
import connectedClusters from './components/connected-clusters-badge';
import connectedClustersDialog from './components/connected-clusters-dialog';
import pageLanding from './components/page-landing';
import passwordVisibility from './components/password-visibility';
import progressLine from './components/progress-line';
import formField from './components/form-field';
import igniteChart from './components/ignite-chart';
import igniteChartSelector from './components/ignite-chart-series-selector';
import statusOutput from './components/status-output';
import timedRedirection from './components/timed-redirection';

import pageProfile from './components/page-profile';
import pagePasswordChanged from './components/page-password-changed';
import pagePasswordReset from './components/page-password-reset';
import pageSignup from './components/page-signup';
import pageSignin from './components/page-signin';
import pageForgotPassword from './components/page-forgot-password';
import formSignup from './components/form-signup';
import sidebar from './components/web-console-sidebar';
import permanentNotifications from './components/permanent-notifications';
import signupConfirmation from './components/page-signup-confirmation';
import noDataCmp from './components/no-data';
import globalProgressBar from './components/global-progress-line';

import baseTemplate from 'views/base.pug';
import * as icons from '../public/images/icons';
// endignite

export default angular
    .module('ignite-console', [
        // Optional AngularJS modules.
        'ngAnimate',
        'ngSanitize',
        'ngMessages',
        // Third party libs.
        'asyncFilter',
        'dndLists',
        'gridster',
        'mgcrea.ngStrap',
        'nvd3',
        'pascalprecht.translate',
        'smart-table',
        'treeControl',
        'ui.grid',
        'ui.grid.autoResize',
        'ui.grid.exporter',
        'ui.grid.resizeColumns',
        'ui.grid.saveState',
        'ui.grid.selection',
        'ui.router',
        // Base modules.
        'ignite-console.core',
        'ignite-console.ace',
        'ignite-console.Form',
        'ignite-console.input-dialog',
        'ignite-console.user',
        'ignite-console.branding',
        'ignite-console.agent',
        'ignite-console.nodes',
        'ignite-console.demo',
        // States.
        'ignite-console.states.logout',
        'ignite-console.states.admin',
        'ignite-console.states.errors',
        'ignite-console.states.settings',
        // Common modules.
        'ignite-console.dialog',
        'ignite-console.navbar',
        'ignite-console.getting-started',
        'ignite-console.loading',
        // Ignite configuration module.
        'ignite-console.config',
        // Components
        webConsoleHeader.name,
        webConsoleFooter.name,
        igniteIcon.name,
        igniteServices.name,
        versionPicker.name,
        userNotifications.name,
        pageAdmin.name,
        pageQueries.name,
        gridColumnSelector.name,
        gridItemSelected.name,
        gridNoData.name,
        gridExport.name,
        gridShowingRows.name,
        bsSelectMenu.name,
        uiGrid.name,
        uiGridHovering.name,
        uiGridFilters.name,
        uiGridColumnResizer.name,
        protectFromBsSelectRender.name,
        AngularStrapTooltip.name,
        AngularStrapSelect.name,
        listEditable.name,
        panelCollapsible.name,
        clusterSelector.name,
        servicesModule.name,
        connectedClusters.name,
        connectedClustersDialog.name,
        igniteListOfRegisteredUsers.name,
        dialogAdminCreateUser.name,
        pageProfile.name,
        pageLanding.name,
        pagePasswordChanged.name,
        pagePasswordReset.name,
        pageSignup.name,
        pageSignin.name,
        pageForgotPassword.name,
        breadcrumbs.name,
        passwordVisibility.name,
        igniteChart.name,
        igniteChartSelector.name,
        statusOutput.name,
        progressLine.name,
        formField.name,
        formSignup.name,
        timedRedirection.name,
        sidebar.name,
        permanentNotifications.name,
        timedRedirection.name,
        signupConfirmation.name,
        noDataCmp.name,
        globalProgressBar.name
    ])
    .service('$exceptionHandler', $exceptionHandler)
    // Directives.
    .directive('igniteAutoFocus', igniteAutoFocus)
    .directive('igniteCopyToClipboard', igniteCopyToClipboard)
    .directive('hideOnStateChange', igniteHideOnStateChange)
    .directive('igniteMatch', igniteMatch)
    .directive('igniteOnClickFocus', igniteOnClickFocus)
    .directive('igniteOnEnter', igniteOnEnter)
    .directive('igniteOnEnterFocusMove', igniteOnEnterFocusMove)
    .directive('igniteOnEscape', igniteOnEscape)
    .directive('igniteRetainSelection', igniteRetainSelection)
    .directive('igniteOnFocusOut', igniteOnFocusOut)
    .directive('btnIgniteLinkDashedSuccess', btnIgniteLink)
    .directive('btnIgniteLinkDashedSecondary', btnIgniteLink)
    // Services.
    .service('IgniteErrorPopover', ErrorPopover)
    .service('JavaTypes', JavaTypes)
    .service('SqlTypes', SqlTypes)
    .service('IgniteChartColors', ChartColors)
    .service('IgniteConfirm', IgniteConfirm)
    .service('Confirm', Confirm)
    .service('IgniteConfirmBatch', ConfirmBatch)
    .service('IgniteCopyToClipboard', CopyToClipboard)
    .service('IgniteCountries', Countries)
    .service('IgniteFocus', Focus)
    .service('IgniteInetAddress', InetAddress)
    .service('IgniteMessages', Messages)
    .service('IgniteErrorParser', ErrorParser)
    .service('IgniteModelNormalizer', ModelNormalizer)
    .service('IgniteLegacyTable', LegacyTable)
    .service('IgniteFormUtils', FormUtils)
    .service('IgniteLegacyUtils', LegacyUtils)
    .service('IgniteActivitiesUserDialog', IgniteActivitiesUserDialog)
    .service('CSV', CSV)
    .service('Store', Store)
    // Filters.
    .filter('byName', byName)
    .filter('bytes', bytes)
    .filter('defaultName', defaultName)
    .filter('domainsValidation', domainsValidation)
    .filter('duration', duration)
    .filter('hasPojo', hasPojo)
    .filter('uiGridSubcategories', uiGridSubcategories)
    .filter('id8', id8)
    .config(['$translateProvider', '$stateProvider', '$locationProvider', '$urlRouterProvider',
        /**
         * @param {angular.translate.ITranslateProvider} $translateProvider
         * @param {import('@uirouter/angularjs').StateProvider} $stateProvider
         * @param {ng.ILocationProvider} $locationProvider
         * @param {import('@uirouter/angularjs').UrlRouterProvider} $urlRouterProvider
         */
        ($translateProvider, $stateProvider, $locationProvider, $urlRouterProvider) => {
            $translateProvider.translations('en', i18n);
            $translateProvider.preferredLanguage('en');

            // Set up the states.
            $stateProvider
                .state('base', {
                    url: '',
                    abstract: true,
                    template: baseTemplate
                });

            $urlRouterProvider.otherwise('/404');
            $locationProvider.html5Mode(true);
        }])
    .run(['$rootScope', '$state', 'gettingStarted',
        /**
         * @param {ng.IRootScopeService} $root
         * @param {import('@uirouter/angularjs').StateService} $state
         * @param {ReturnType<typeof import('./modules/getting-started/GettingStarted.provider').service>} gettingStarted
         */
        ($root, $state, gettingStarted) => {
            $root._ = _;
            $root.$state = $state;
            $root.gettingStarted = gettingStarted;
        }
    ])
    .run(['$rootScope', 'AgentManager',
        /**
         * @param {ng.IRootScopeService} $root
         * @param {import('./modules/agent/AgentManager.service').default} agentMgr
         */
        ($root, agentMgr) => {
            let lastUser;

            $root.$on('user', (e, user) => {
                if (lastUser)
                    return;

                lastUser = user;

                agentMgr.connect();
            });
        }
    ])
    .run(['$transitions',
        /**
         * @param {import('@uirouter/angularjs').TransitionService} $transitions
         */
        ($transitions) => {
            $transitions.onSuccess({ }, (trans) => {
                try {
                    const {name, unsaved} = trans.$to();
                    const params = trans.params();

                    if (unsaved)
                        localStorage.removeItem('lastStateChangeSuccess');
                    else
                        localStorage.setItem('lastStateChangeSuccess', JSON.stringify({name, params}));
                }
                catch (ignored) {
                    // No-op.
                }
            });
        }
    ])
    .run(['$rootScope', '$http', '$state', 'IgniteMessages', 'User', 'IgniteNotebookData',
        /**
         * @param {ng.IRootScopeService} $root
         * @param {ng.IHttpService} $http
         * @param {ReturnType<typeof import('./services/Messages.service').default>} Messages
         */
        ($root, $http, $state, Messages, User, Notebook) => { // eslint-disable-line no-shadow
            $root.revertIdentity = () => {
                $http.get('/api/v1/admin/revert/identity')
                    .then(() => User.load())
                    .then(() => $state.go('base.settings.admin'))
                    .then(() => Notebook.load())
                    .catch(Messages.showError);
            };
        }
    ])
    .run(['IgniteIcon',
        /**
         * @param {import('./components/ignite-icon/service').default} IgniteIcon
         */
        (IgniteIcon) => IgniteIcon.registerIcons(icons)
    ]);
