import { APP_INITIALIZER, ErrorHandler, NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";

import { AppRoutingModule } from "./app-routing.module";
import { AppComponent } from "./app.component";
import { KeycloakService } from "keycloak-angular";
import { initializeKeycloak } from "./core/init-keycloak";
import { HttpClient } from "@angular/common/http";
import { environment } from "../environments/environment";
import { FooterComponent } from "src/app/components/footer/footer.component";
import { HeaderComponent } from "src/app/components/header/header.component";
import { NotFoundComponent } from "src/app/components/error/not-found/not-found.component";
import { TranslateLoader, TranslateModule } from "@ngx-translate/core";
import { TranslateHttpLoader } from "@ngx-translate/http-loader";
import { Logger } from "src/app/service/logger.service";
import { SharedModule } from "src/app/modules/shared/shared.module";
import { SpinnerComponent } from "src/app/components/spinner/spinner.component";
import { ConfirmationService, MessageService } from "primeng/api";
import { DialogService } from "primeng/dynamicdialog";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { SidebarComponent } from "./components/sidebar/sidebar.component";
import { ErrorHandlingService } from "src/app/service/error-handling.service";
import { HomeComponent } from "./components/home/home.component";
import { RedirectComponent } from "./components/redirect/redirect.component";
import { SettingsService } from "src/app/service/settings.service";
import { LogoutComponent } from './components/logout/logout.component';

if (environment.production) {
  Logger.enableProductionMode();
} else {
  Logger.enableDevMode();
}

export function HttpLoaderFactory(http: HttpClient) {
  return new TranslateHttpLoader(http);
}

export function appInitializerFactory(
  keycloak: KeycloakService,
  settings: SettingsService,
): () => Promise<void> {
  return (): Promise<void> =>
    new Promise<void>((resolve, reject) => {
      settings
        .loadSettings()
        .then(() => initializeKeycloak(keycloak, settings))
        .then(() => resolve())
        .catch((error) => reject(error));
    });
}

@NgModule({
  declarations: [
    AppComponent,
    FooterComponent,
    HeaderComponent,
    NotFoundComponent,
    SpinnerComponent,
    SidebarComponent,
    HomeComponent,
    RedirectComponent,
    LogoutComponent,
  ],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    AppRoutingModule,
    SharedModule,
    TranslateModule.forRoot({
      defaultLanguage: "en",
      loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [HttpClient],
      },
    }),
  ],
  exports: [
    BrowserModule,
    BrowserAnimationsModule,
    SharedModule,
    AppRoutingModule,
  ],
  providers: [
    MessageService,
    ConfirmationService,
    DialogService,
    KeycloakService,
    {
      provide: APP_INITIALIZER,
      useFactory: appInitializerFactory,
      multi: true,
      deps: [KeycloakService, SettingsService],
    },
    {
      provide: ErrorHandler,
      useClass: ErrorHandlingService,
    },
  ],
  bootstrap: [AppComponent],
})
export class AppModule {}