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

import { Effect, Actions, ofType } from '@ngrx/effects';
import { switchMap } from 'rxjs/operators';

import * as criteriaActions from '../../metamodel/action/criteria.action';
import * as searchActions from './search.action';
import { BetweenCriterion } from './model';

@Injectable()
export class SearchEffects {
    constructor(
        private actions$: Actions
    ) { }

    @Effect()
    loadDatasetAttributeListSuccessAction$ = this.actions$.pipe(
        ofType(criteriaActions.LOAD_DATASET_ATTRIBUTE_LIST_SUCCESS),
        switchMap((action: criteriaActions.LoadDatasetAttributeListSuccessAction) => {
            const outputList = action.payload
                .filter(attribute => attribute.selected && attribute.id_output_family)
                .map(attribute => attribute.id);

            const criteriaList = action.payload
                .filter(attribute => attribute.id_criteria_family && attribute.search_type && attribute.min)
                .map(attribute => {
                    if (attribute.search_type === 'bw') {
                        return new BetweenCriterion(attribute.id, attribute.min.toString(), attribute.max.toString());
                    }
                });

            return [
                new searchActions.UpdateOutputListAction(outputList),
                new searchActions.UpdateCriteriaListAction(criteriaList)
            ];
        })
    );
}