import { APP_INITIALIZER, NgModule } from "@angular/core";
import { NehubaViewerContainerDirective } from './nehubaViewerInterface/nehubaViewerInterface.directive'
import { IMPORT_NEHUBA_INJECT_TOKEN, NehubaViewerUnit } from "./nehubaViewer/nehubaViewer.component";
import { CommonModule } from "@angular/common";
import { APPEND_SCRIPT_TOKEN } from "src/util/constants";
import { importNehubaFactory, NEHUBA_INSTANCE_INJTKN } from "./util";
import { NehubaViewerTouchDirective } from "./nehubaViewerInterface/nehubaViewerTouch.directive";
import { StoreModule } from "@ngrx/store";
import { NEHUBA_VIEWER_FEATURE_KEY } from "./constants";
import { reducer } from "./store";
import { NehubaGlueCmp } from "./nehubaViewerGlue/nehubaViewerGlue.component";
import { UtilModule } from "src/util";
import { ComponentsModule } from "src/components";
import { AngularMaterialModule } from "src/sharedModules";
import { MouseoverModule } from "src/mouseoverModule";
import { StatusCardComponent } from "./statusCard/statusCard.component";
import { ShareModule } from "src/share";
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
import { BehaviorSubject } from "rxjs";
import { StateModule } from "src/state";
import { AuthModule } from "src/auth";
import {QuickTourModule} from "src/ui/quickTour/module";
import { WindowResizeModule } from "src/util/windowResize";
import { EffectsModule } from "@ngrx/effects";
import { MeshEffects } from "./mesh.effects/mesh.effects";
import { NehubaLayoutOverlayModule } from "./layoutOverlay";
import { NgAnnotationService } from "./annotation/service";
import { NgAnnotationEffects } from "./annotation/effects";
import { NehubaViewerContainer } from "./nehubaViewerInterface/nehubaViewerContainer.component";
import { NehubaUserLayerModule } from "./userLayers";

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule,
    UtilModule,
    AngularMaterialModule,
    ComponentsModule,
    MouseoverModule,
    ShareModule,
    WindowResizeModule,
    NehubaUserLayerModule,

    /**
     * should probably break this into its own...
     * share url module or something?
     */
    StateModule,
    AuthModule,
    StoreModule.forFeature(
      NEHUBA_VIEWER_FEATURE_KEY,
      reducer
    ),
    EffectsModule.forFeature([
      MeshEffects,
      NgAnnotationEffects,
    ]),
    QuickTourModule,
    NehubaLayoutOverlayModule,
  ],
  declarations: [
    NehubaViewerContainerDirective,
    NehubaViewerUnit,
    NehubaViewerTouchDirective,
    NehubaGlueCmp,
    StatusCardComponent,
    NehubaViewerContainer,
  ],
  exports: [
    NehubaViewerUnit,
    NehubaViewerTouchDirective,
    NehubaGlueCmp,
    StatusCardComponent,
  ],
  providers: [
    
    {
      provide: IMPORT_NEHUBA_INJECT_TOKEN,
      useFactory: importNehubaFactory,
      deps: [ APPEND_SCRIPT_TOKEN ]
    },
    {
      provide: NEHUBA_INSTANCE_INJTKN,
      useValue: new BehaviorSubject(null)
    },
    {
      provide: APP_INITIALIZER,
      multi: true,
      useFactory: (_svc: NgAnnotationService) => () => Promise.resolve(),
      deps: [ NgAnnotationService ]
    },
    NgAnnotationService
  ]
})

export class NehubaModule{}