/**
 * This file is part of Anis Client.
 *
 * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

import { Injectable } from '@angular/core';

import { Actions, createEffect, ofType, concatLatestFrom } from '@ngrx/effects';
import { Store  } from '@ngrx/store';
import { of } from 'rxjs';
import { map, tap, mergeMap, catchError } from 'rxjs/operators';
import { ToastrService } from 'ngx-toastr';

import * as svomJsonKwActions from '../actions/svom-json-kw.actions';
import * as svomJsonKwSelector from '../selectors/svom-json-kw.selector';

import { SvomJsonKwService } from '../services/svom-json-kw.service';

/**
 * @class
 * @classdesc Svom Json Kw effects.
 */
@Injectable()
export class SvomJsonKwEffects {
    selectAcronym$ = createEffect((): any =>
        this.actions$.pipe(
            ofType(svomJsonKwActions.selectAcronym),
            map(() => svomJsonKwActions.loadKwSearchable())
        )
    );

    loadKwSearchable$ = createEffect(() => 
        this.actions$.pipe(
            ofType(svomJsonKwActions.loadKwSearchable),
            concatLatestFrom(() => this.store.select(svomJsonKwSelector.selectAcronymSelected)),
            mergeMap(([action, acronymSelected]) => this.svomJsonKwService.loadKwSearchable(acronymSelected)
                .pipe(
                    map(svomKeywords => svomJsonKwActions.loadKwSearchableSuccess({ svomKeywords })),
                    catchError(() => of(svomJsonKwActions.loadKwSearchableFail()))
                )
            )
        )
    );

    loadKwSearchableSuccess$ = createEffect(() => 
        this.actions$.pipe(
            ofType(svomJsonKwActions.loadKwSearchableSuccess),
            tap(() => {
                this.toastr.success('SVOM Json Keywords was loaded successfully and are now available to product criteria', 'SVOM Json Keywords loaded')
            })
        ), { dispatch: false}
    );

    addDatabaseFail$ = createEffect(() => 
        this.actions$.pipe(
            ofType(svomJsonKwActions.loadKwSearchableFail),
            tap(() => this.toastr.error('Failure to load Keywords', 'SVOM Json Keywords loaded failed'))
        ), { dispatch: false}
    );

    constructor(
        private actions$: Actions,
        private store: Store<{ }>,
        private svomJsonKwService: SvomJsonKwService,
        private toastr: ToastrService
    ) {}
}