import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';
import { CommonModule } from '@angular/common';

import { throwIfAlreadyLoaded } from './module-import-guard';
import { AuthService } from './services/auth.service';
import { CourseData } from './data/course';
import { CourseService } from './mock/course.service';
import { MockDataModule } from './mock/mock-data.module';
import { GanttData } from './data/gantt';
import { GanttDataService } from './mock/gantt-data.service';
import { ListData } from './data/listData';
import { ListDataService } from './mock/list-data.service';
import { PersonalizeService } from './services/personalize.service';
import { WorkItemData } from './data/workItem';
import { WorkItemService } from './mock/work-item.service';
import { WorkGroupData } from './data/work-group';
import { WorkGroupService } from './mock/work-group.service';
import { AuthGuardService } from './services/auth-guard-service.guard';
import { CustomThemeService } from './services/custom-theme.service';
import { NoticeData } from './data/noticeData';
import { NoticeDataService } from './mock/notice-data.service';

const DATA_SERVICES = [
  { provide: CourseData, useClass: CourseService },
  { provide: GanttData, useClass: GanttDataService },
  { provide: ListData, useClass: ListDataService },
  { provide: WorkItemData, useClass: WorkItemService },
  { provide: WorkGroupData, useClass: WorkGroupService },
  { provide: NoticeData, useClass: NoticeDataService },
];

export const DEVUI_CORE_PROVIDERS = [
  ...MockDataModule.forRoot().providers!,
  ...DATA_SERVICES,
  AuthService,
  PersonalizeService,
  AuthGuardService,
  CustomThemeService,
];

@NgModule({
  declarations: [],
  imports: [CommonModule],
})
export class CoreModule {
  constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
    throwIfAlreadyLoaded(parentModule, 'CoreModule');
  }

  static forRoot(): ModuleWithProviders<CoreModule> {
    return {
      ngModule: CoreModule,
      providers: [...DEVUI_CORE_PROVIDERS],
    };
  }
}