import { ENVIRONMENT, EnvironmentType } from '@admin/providers'
import { provideHttpClient, withInterceptors } from '@angular/common/http'
import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core'
import { getMessaging, provideMessaging } from '@angular/fire/messaging'
import { provideNativeDateAdapter } from '@angular/material/core'
import { provideAnimations } from '@angular/platform-browser/animations'
import { provideRouter } from '@angular/router'
import { provideApi } from '@api-client/angular'
import { jsonDateInterceptor } from '@frontend/shared'
import { provideWSClient } from '@frontend/ws'
import { provideHotToastConfig } from '@ngxpert/hot-toast'
import { provideEchartsCore } from 'ngx-echarts'
import { adminShellRoutes } from './admin-shell.routes'
import { authInterceptor } from './auth'
import { provideCore } from './core'

/** Shell is entry point to application. Import in bootstrap of application */
export function provideAdminShell(config: EnvironmentType): EnvironmentProviders {
	return makeEnvironmentProviders([
		provideAnimations(),
		provideHttpClient(withInterceptors([authInterceptor, jsonDateInterceptor])),
		provideRouter(adminShellRoutes),

		provideApi({ basePath: config.baseUrl }),

		// Material
		provideNativeDateAdapter(),

		// Echarts
		provideEchartsCore({ echarts: () => import('echarts') }),

		// Hot Toast
		provideHotToastConfig(),

		// Firebase
		provideMessaging(() => getMessaging()),

		// Environment
		{ provide: ENVIRONMENT, useValue: config },

		// WebSockets
		provideWSClient(config.baseWSUrl),

		// Application
		provideCore(config),
	])
}
