import * as actions from './search.action';

import { Criterion, SearchMeta } from './model';

export interface State {
    currentStep: string;
    datasetName: string;
    criteriaStepChecked: boolean;
    outputStepChecked: boolean;
    resultStepChecked: boolean;
    criteriaList: Criterion[];
    outputList: number[];
    searchMeta: SearchMeta;
    searchData: any[];
}

const initialState: State = {
    currentStep: null,
    datasetName: null,
    criteriaStepChecked: false,
    outputStepChecked: false,
    resultStepChecked: false,
    criteriaList: [],
    outputList: [],
    searchMeta: null,
    searchData: null
};

export function reducer(state: State = initialState, action: actions.Actions): State {
    switch (action.type) {
        case actions.CHANGE_STEP:
            const currentStep = action.payload as string;

            return {
                ...state,
                currentStep
            };

        case actions.SELECT_DATASET:
            const datasetName = action.payload as string;

            return {
                ...state,
                datasetName
            };

        case actions.NEW_SEARCH:
            return initialState;

        case actions.CRITERIA_CHECKED:
            return {
                ...state,
                criteriaStepChecked: true
            };

        case actions.OUTPUT_CHECKED:
            return {
                ...state,
                outputStepChecked: true
            };

        case actions.RESULT_CHECKED:
            return {
                ...state,
                resultStepChecked: true
            };

        case actions.UPDATE_CRITERIA_LIST:
            const criteriaList = action.payload as Criterion[];

            return {
                ...state,
                criteriaList
            };

        case actions.ADD_CRITERION:
            const criterion = action.payload as Criterion;

            return {
                ...state,
                criteriaList: [...state.criteriaList, criterion]
            };

        case actions.DELETE_CRITERION:
            const id = action.payload as number;

            return {
                ...state,
                criteriaList: [...state.criteriaList.filter(c => c.id !== id)]
            };

        case actions.UPDATE_OUTPUT_LIST:
            const outputList = action.payload as number[];

            return {
                ...state,
                outputList
            };

        case actions.RETRIEVE_META_SUCCESS:
            const searchMeta = action.payload as SearchMeta;

            return {
                ...state,
                searchMeta
            }

        case actions.RETRIEVE_DATA_SUCCESS:
            const searchData = action.payload as any[];

            return {
                ...state,
                searchData
            }

        default:
            return state;
    }
}

export const getCurrentStep = (state: State) => state.currentStep;
export const getDatasetName = (state: State) => state.datasetName;
export const getCriteriaStepChecked = (state: State) => state.criteriaStepChecked;
export const getOutputStepChecked = (state: State) => state.outputStepChecked;
export const getResultStepChecked = (state: State) => state.resultStepChecked;
export const getCriteriaList = (state: State) => state.criteriaList;
export const getOutputList = (state: State) => state.outputList;
export const getSearchMeta = (state: State) => state.searchMeta;
export const getSearchData = (state: State) => state.searchData;