import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Observable, Subject } from 'rxjs';

import {
    TranslateModule,
    TranslateLoader,
    MissingTranslationHandler,
    MissingTranslationHandlerParams
} from '@ngx-translate/core';

import {
    RtlClassDirective,
    RtlDirectionDirective
} from './core/directives';

import {
    CapitalizePipe,
    EncodePipe,
    EscapePipe,
    ReplaceLineBreaks,
    DateFormatter,
    DateStringFormatter,
    safeHtml,
    SafePipe,
    SplitUppercase
} from './core/pipes';


const commonDirectives = [
    RtlClassDirective,
    RtlDirectionDirective
];

const commonPipes = [
    CapitalizePipe,
    EncodePipe,
    EscapePipe,
    ReplaceLineBreaks,
    DateFormatter,
    DateStringFormatter,
    safeHtml,
    SafePipe,
    SplitUppercase
];

export class Loader implements TranslateLoader {
    private translations = new Subject();
    $translations = this.translations.asObservable();
    getTranslation(lang: string) {
        console.log(`called with ${lang}`);
        return this.$translations;
    }
}

export class Missing implements MissingTranslationHandler {
    handle(params: MissingTranslationHandlerParams) {
        return '... and many more';
    }
}

export function LoaderFactory() {
    return new Loader();
}

@NgModule({
    declarations: [
        commonDirectives,
        commonPipes,
    ],
    imports: [
        CommonModule,
        TranslateModule.forChild({
            loader: {
                provide: TranslateLoader,
                useFactory: LoaderFactory
            },
            missingTranslationHandler: {
                provide: MissingTranslationHandler,
                useClass: Missing
            }
        }),
    ],
    exports: [
        commonDirectives,
        commonPipes,
        TranslateModule
    ],
})
export class PepperiModule {
    // static forRoot(): ModuleWithProviders<PepperiModule> {
    //     return {
    //         ngModule: PepperiModule,
    //         providers: [SessionService]
    //     };
    // }

    // static forRoot() {
    //     return {
    //       ngModule: PepperiModule,
    //       providers: [ CustomizationService, SessionService ]
    //     }
    // }
}
