
import {NgModule, Injectable, APP_INITIALIZER} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {AppRoutingModule} from './app-routing.module';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {HttpClientModule, HttpInterceptor, HttpHandler, HttpRequest, HTTP_INTERCEPTORS} from '@angular/common/http';
import {MaterialModule} from './material/material.module';
import {QRCodeModule} from 'angularx-qrcode';

import {I18nPipe} from './utils/i18n.pipe';
import {ImprintComponent, PrivacyPolicyComponent, TermsOfServiceComponent} from './pages/general/general.component';
import {AccountComponent} from './pages/account/account.component';
import {ServicesComponent} from './pages/services/services.component';
import {AppComponent} from './app.component';
import {LoginComponent} from './pages/login/login.component';
import {LoginTotpComponent} from './pages/login-totp/login-totp.component';
import {FormLoginComponent} from './pages/form-login/form-login.component';
import {FormLoginTotpComponent} from './pages/form-login-totp/form-login-totp.component';
import {TokensComponent} from './pages/tokens/tokens.component';
import {PermissionsComponent} from './ui/permissions/permissions.component';
import {ProfileFieldDialog, ProfileFieldsComponent, ProfileFieldBlob} from './ui/profilefields/profilefields.component';
import {QuotasComponent} from './ui/quotas/quotas.component';
import {SecurityComponent, SecurityTotpDialog} from './pages/account/security/security.component';
import {VoucherComponent} from './pages/account/voucher/voucher.component';
import {VoucherDialog} from './pages/account/voucher/voucher.component';
import {InfoComponent} from './pages/account/info/info.component';
import {ProfileComponent} from './pages/account/profile/profile.component';
import {PasswordComponent} from './pages/password/password.component';
import {PasswordResetComponent} from './pages/password-reset/password-reset.component';
import {RegisterComponent, RegisterDialog} from './pages/register/register.component';
import {UsernameDialog} from './pages/register/username-dialog/username.dialog';
import {UnavailableComponent} from './pages/unavailable/unavailable.component';
import {NotfoundComponent} from './pages/notfound/notfound.component';
import {HtmlComponent} from './utils/html/html.component';


import {I18nService} from './services/i18n.service';


export function init_app(i18n: I18nService) {
  return () => i18n.fetch(i18n.getLocale()).then(response => {}, error => {});
}

@Injectable()
export class XhrInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler) {
    const xhr = req.clone({
      headers: req.headers.set('X-Requested-With', 'XMLHttpRequest').set('Content-Type', 'application/json;charset=UTF-8'), withCredentials: true
    });
    return next.handle(xhr);
  }
}

@NgModule({
  declarations: [
    I18nPipe,
    AppComponent,
    ImprintComponent, PrivacyPolicyComponent, TermsOfServiceComponent,
    AccountComponent,
    LoginComponent,
    LoginTotpComponent,
    FormLoginComponent,
    FormLoginTotpComponent,
    TokensComponent,
    ServicesComponent,
    PermissionsComponent,
    ProfileFieldsComponent, ProfileFieldDialog, ProfileFieldBlob,
    QuotasComponent,
    SecurityComponent,
    SecurityTotpDialog,
    VoucherComponent,
    VoucherDialog,
    InfoComponent,
    ProfileComponent,
    PasswordComponent,
    PasswordResetComponent,
    RegisterComponent,
    RegisterDialog,
    UsernameDialog,
    UnavailableComponent,
    NotfoundComponent,
    HtmlComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    MaterialModule,
    HttpClientModule,
    FormsModule,
    ReactiveFormsModule,
    QRCodeModule,
  ],
  exports: [MaterialModule],
  providers: [{provide: APP_INITIALIZER, useFactory: init_app, deps: [I18nService], multi: true}, {provide: HTTP_INTERCEPTORS, useClass: XhrInterceptor, multi: true}],
  bootstrap: [AppComponent],
})
export class AppModule {
}
