/*
 * 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';
// endignite

// 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 {default as IgniteConfirm, Confirm} 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 igniteServices from './services';

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

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)
    ]);
