import { inject, provideAppInitializer } from "@angular/core";
import { ApplicationConfig, provideZoneChangeDetection } from "@angular/core";
import { provideRouter } from "@angular/router";
import { DatePipe } from "@angular/common";
import { provideHttpClient, withInterceptors } from "@angular/common/http";

import { DateService } from "../services/date.service";
import { AircraftService } from "../services/aircraft.service";
import { DropzoneService } from "../services/dropzone.service";
import { GearService } from "../services/gear.service";
import { JumpService } from "../services/jump.service";
import { JumpTypeService } from "../services/jump-type.service";
import { StatsService } from "../services/stats.service";
import { ServiceComm } from "../services/service-comm.service";
import { RequestCache } from "../services/request-cache.service";
import { ImageService } from "../services/image.service";
import { ConfigurationHelper } from "../services/configuration-helper";
import { ServiceCacheApi } from "../services/service-cache-api.service";
import { TunnelService } from "../services/tunnel.service";
import { TunnelFlightService } from "../services/tunnel-flight.service";

import { provideCharts, withDefaultRegisterables } from "ng2-charts";

import { JwtAuthInterceptor } from "../interceptor/jwt-auth.interceptor";
import { ErrorInterceptor } from "../interceptor/error.interceptor";
import { environment } from "../environments/environment";

import { routes } from "./app.routes";

import { provideTranslateService } from "@ngx-translate/core";
import { provideTranslateHttpLoader } from "@ngx-translate/http-loader";

// Déclaration de la fonction d'initialisation de la configuration
export function initConfig(configService: ConfigurationHelper) {
  return () => configService.load(environment.env);
}

export const appConfig: ApplicationConfig = {
  providers: [
    TunnelService,
    TunnelFlightService,
    ImageService,
    AircraftService,
    DropzoneService,
    GearService,
    JumpService,
    JumpTypeService,
    StatsService,
    ServiceComm,
    DateService,
    RequestCache,
    ConfigurationHelper,
    DatePipe,
    ServiceCacheApi,
    provideAppInitializer(() => {
      const initializerFn = initConfig(inject(ConfigurationHelper));
      return initializerFn();
    }),
    provideHttpClient(withInterceptors([JwtAuthInterceptor, ErrorInterceptor])),
    provideCharts(withDefaultRegisterables()),
    provideZoneChangeDetection({ eventCoalescing: true }),
    provideRouter(routes),
    provideHttpClient(),
    provideTranslateService({
      loader: provideTranslateHttpLoader({
        prefix: "/assets/i18n/",
        suffix: ".json",
      }),
      fallbackLang: "en",
      lang: "en",
    }),
  ],
};
