import { ApiRootService } from '@alfa-client/api-root-shared';
import { Environment, ENVIRONMENT_CONFIG } from '@alfa-client/environment-shared';
import { ResourceRepository, TechSharedModule } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import KcAdminClient from '@keycloak/keycloak-admin-client';
import {
  createSettingListResourceService,
  SettingListResourceService,
} from './admin-settings-resource.service';
import { SettingsService } from './admin-settings.service';
import {
  ConfigurationResourceService,
  createConfigurationResourceService,
} from './configuration/configuration-resource.service';
import { ConfigurationService } from './configuration/configuration.service';
import { NavigationComponent } from './navigation/navigation.component';
import { OrganisationseinheitContainerComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-container.component';
import { OrganisationseinheitFormComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-form/organisationseinheit-form.component';
import { OrganisationseinheitListComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component';
import { OrganisationseinheitNavigationItemComponent } from './organisationseinheit/organisationseinheit-navigation-item/organisationseinheit-navigation-item.component';
import { PostfachContainerComponent } from './postfach/postfach-container/postfach-container.component';
import { PostfachFormComponent } from './postfach/postfach-container/postfach-form/postfach-form.component';
import { PostfachNavigationItemComponent } from './postfach/postfach-navigation-item/postfach-navigation-item.component';
import {
  createPostfachResourceService,
  PostfachResourceService,
} from './postfach/postfach-resource.service';
import { PostfachService } from './postfach/postfach.service';
import { MoreItemButtonComponent } from './shared/more-menu/more-item-button/more-item-button.component';
import { MoreMenuComponent } from './shared/more-menu/more-menu.component';
import { NavigationItemComponent } from './shared/navigation-item/navigation-item.component';
import { PrimaryButtonComponent } from './shared/primary-button/primary-button.component';
import { SecondaryButtonComponent } from './shared/secondary-button/secondary-button.component';
import { SpinnerComponent } from './shared/spinner/spinner.component';
import { TextFieldComponent } from './shared/text-field/text-field.component';

@NgModule({
  declarations: [
    PostfachContainerComponent,
    PostfachFormComponent,
    NavigationItemComponent,
    TextFieldComponent,
    PostfachNavigationItemComponent,
    OrganisationseinheitContainerComponent,
    OrganisationseinheitFormComponent,
    PrimaryButtonComponent,
    NavigationComponent,
    SecondaryButtonComponent,
    OrganisationseinheitNavigationItemComponent,
    OrganisationseinheitListComponent,
    MoreMenuComponent,
    MoreItemButtonComponent,
    SpinnerComponent,
  ],
  imports: [CommonModule, TechSharedModule, RouterModule, ReactiveFormsModule],
  exports: [
    PostfachContainerComponent,
    OrganisationseinheitContainerComponent,
    NavigationComponent,
    NavigationItemComponent,
  ],
  providers: [
    ConfigurationService,
    SettingsService,
    PostfachService,
    {
      provide: KcAdminClient,
      useFactory: (env: Environment) =>
        new KcAdminClient({
          baseUrl: env.authServer,
          realmName: env.realm,
        }),
      deps: [ENVIRONMENT_CONFIG],
    },
    {
      provide: PostfachResourceService,
      useFactory: createPostfachResourceService,
      deps: [ResourceRepository, SettingsService],
    },
    {
      provide: ConfigurationResourceService,
      useFactory: createConfigurationResourceService,
      deps: [ResourceRepository, ApiRootService],
    },
    {
      provide: SettingListResourceService,
      useFactory: createSettingListResourceService,
      deps: [ResourceRepository, ConfigurationService],
    },
  ],
})
export class AdminSettingsModule {}