/*-
 * ============LICENSE_START=======================================================
 * SDC
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed 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.
 * ============LICENSE_END=========================================================
 */

import { BrowserModule } from '@angular/platform-browser';
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { forwardRef } from '@angular/core';
import { AppComponent } from './app.component';
import { UpgradeAdapter } from '@angular/upgrade';
import { UpgradeModule } from '@angular/upgrade/static';
import { SdcUiComponentsModule, SdcUiComponents } from "sdc-ui/lib/angular";
import { PropertiesAssignmentModule } from './pages/properties-assignment/properties-assignment.module';
import {
    DataTypesServiceProvider, SharingServiceProvider, CookieServiceProvider, StateServiceFactory,
    StateParamsServiceFactory, CacheServiceProvider, EventListenerServiceProvider, ScopeServiceFactory,
    NotificationServiceProvider, ComponentFactoryProvider
} from "./utils/ng1-upgraded-provider";
import { ConfigService } from "./services/config.service";
import { HttpModule } from '@angular/http';
import { HttpService } from './services/http.service';
import { AuthenticationService } from './services/authentication.service';
import { Cookie2Service } from "./services/cookie.service";
import { ComponentServiceNg2 } from "./services/component-services/component.service";
import { ComponentServiceFactoryNg2 } from "./services/component-services/component.service.factory";
import { ServiceServiceNg2 } from "./services/component-services/service.service";
import { ComponentInstanceServiceNg2 } from "./services/component-instance-services/component-instance.service";
import { WorkflowServiceNg2 } from './services/workflow.service';
import { ModalService } from "./services/modal.service";
import { UiElementsModule } from "./components/ui/ui-elements.module";
import { ConnectionWizardModule } from "./pages/connection-wizard/connection-wizard.module";
import { InterfaceOperationModule } from "./pages/interface-operation/interface-operation.module";
import { OperationCreatorModule } from "./pages/interface-operation/operation-creator/operation-creator.module";
import { LayoutModule } from "./components/layout/layout.module";
import { UserService } from "./services/user.service";
import { DynamicComponentService } from "./services/dynamic-component.service";
import { SdcConfig } from "./config/sdc-config.config";
import { SdcMenu } from "./config/sdc-menu.config";
import { TranslateModule } from "./shared/translator/translate.module";
import { TranslationServiceConfig } from "./config/translation.service.config";
import { MultilineEllipsisModule } from "./shared/multiline-ellipsis/multiline-ellipsis.module";
import { ServicePathCreatorModule } from './pages/service-path-creator/service-path-creator.module';
import { ServicePathsListModule } from './pages/service-paths-list/service-paths-list.module';
import { ServicePathModule } from 'app/ng2/components/logic/service-path/service-path.module';
import { ServicePathSelectorModule } from 'app/ng2/components/logic/service-path-selector/service-path-selector.module';
import { CompositionPanelModule } from 'app/ng2/pages/composition/panel/panel.module';
import { WindowRef } from "./services/window.service";
import {ArchiveService} from "./services/archive.service";
import { ModalsHandlerProvider } from './utils/ng1-upgraded-provider';
import {PluginFrameModule} from "./components/ui/plugin/plugin-frame.module";
import {PluginsService} from "./services/plugins.service";
import {EventBusService} from "./services/event-bus.service";
import {GroupsService} from "./services/groups.service";
import {PoliciesService} from "./services/policies.service";
import {AutomatedUpgradeService} from "./pages/automated-upgrade/automated-upgrade.service";
import {AutomatedUpgradeModule} from "./pages/automated-upgrade/automated-upgrade.module";

export const upgradeAdapter = new UpgradeAdapter(forwardRef(() => AppModule));

export function configServiceFactory(config: ConfigService) {
    return () => {
        return Promise.all([
            config.loadValidationConfiguration(),
            config.loadPluginsConfiguration()
        ]);
    }
}


@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        UpgradeModule,
        FormsModule,
        HttpModule,
        LayoutModule,
        TranslateModule,
        MultilineEllipsisModule,
        UiElementsModule,
        CompositionPanelModule,
        SdcUiComponentsModule,
        AutomatedUpgradeModule,
        //We need to import them here since we use them in angular1
        ConnectionWizardModule,
        PropertiesAssignmentModule,
        PluginFrameModule,
        InterfaceOperationModule,
        OperationCreatorModule,
        ServicePathCreatorModule,
        ServicePathsListModule,
        ServicePathModule,
        ServicePathSelectorModule
    ],
    exports: [],
    entryComponents: [
        // *** sdc-ui components to be used as downgraded:
        // SdcUiComponents.ButtonComponent
    ],
    providers: [
        WindowRef,
        DataTypesServiceProvider,
        SharingServiceProvider,
        ComponentFactoryProvider,
        CookieServiceProvider,
        StateServiceFactory,
        StateParamsServiceFactory,
        ScopeServiceFactory,
        CacheServiceProvider,
        EventListenerServiceProvider,
        NotificationServiceProvider,
        ModalsHandlerProvider,
        AuthenticationService,
        Cookie2Service,
        ConfigService,
        ComponentServiceNg2,
        ComponentServiceFactoryNg2,
        ModalService,
        ServiceServiceNg2,
        AutomatedUpgradeService,
        WorkflowServiceNg2,
        HttpService,
        UserService,
        PoliciesService,
        GroupsService,
        DynamicComponentService,
        SdcConfig,
        SdcMenu,
        ComponentInstanceServiceNg2,
        TranslationServiceConfig,
        PluginsService,
        ArchiveService,
        EventBusService,
        {
            provide: APP_INITIALIZER,
            useFactory: configServiceFactory,
            deps: [ConfigService],
            multi: true
        },
    ],
    bootstrap: [AppComponent]
})


export class AppModule {
    constructor(public upgrade: UpgradeModule, public eventBusService:EventBusService) {

    }
}