import { FactoryProvider, ModuleWithProviders, NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { StoreModule } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import { HypermediaQueryBindingModule } from 'first-npm-package-nicule/models';

import { LinkDirective } from './directives';
import { ActionExecutor, HeaderProvider, HrefFormatterProvider, HypermediaStore, LabelingService, ProgressTracker, ResourceFetcher } from './services';

import { hypermediaReducers } from './reducers';
import { HypermediaEffects } from './effects';
import { RouterModule } from '@angular/router';
import { ProgressInterceptor } from './services/progress-interceptor';
import { HTTP_INTERCEPTORS } from '@angular/common/http';

const COMPONENTS = [
    LinkDirective
];

@NgModule({
    imports: [
        CommonModule,
        TranslateModule,
        RouterModule,
        FormsModule,

        HypermediaQueryBindingModule.forRoot(),
        StoreModule.forFeature('hypermedia', hypermediaReducers),
        EffectsModule.forFeature([HypermediaEffects]),

        //ProgressHttpModule
    ],
    declarations: COMPONENTS,
    exports: COMPONENTS
})
export class HypermediaModule {
    static forChild(): ModuleWithProviders {
        return {
            ngModule: HypermediaModule
        };
    }

    static forRoot(applicationScopesFactory: FactoryProvider): ModuleWithProviders {
        return {
            ngModule: HypermediaModule,
            providers: [
                HypermediaEffects,
                HypermediaStore,
                applicationScopesFactory,
                HrefFormatterProvider,
                LabelingService,
                ResourceFetcher,
                ProgressTracker,
                HeaderProvider,
                ActionExecutor,
                { provide: HTTP_INTERCEPTORS, useClass: ProgressInterceptor, multi: true },
            ]
        };
    }
}
