import * as actions from './search-multiple.action';
import { Attribute } from "../../metamodel/model";
import { DatasetCount, SearchMultipleQueryParams } from "./model";

export interface State {
    pristine: boolean;
    currentStep: string;
    positionStepChecked: boolean;
    datasetsStepChecked: boolean;
    resultStepChecked: boolean;
    queryParams: SearchMultipleQueryParams;
    selectedDatasets: string[];
    datasetsCountIsLoading: boolean;
    datasetsCountIsLoaded: boolean;
    datasetsCount: DatasetCount[];
    attributeList: { dname: string, attributeList: Attribute[] }[];
    data: { dname: string, data: any[] }[];
    selectedData: { dname: string, data: (string | number)[] }[];
}

export const initialState: State = {
    pristine: true,
    currentStep: null,
    positionStepChecked: false,
    datasetsStepChecked: false,
    resultStepChecked: false,
    queryParams: null,
    selectedDatasets: [],
    datasetsCountIsLoading: false,
    datasetsCountIsLoaded: false,
    datasetsCount: [],
    attributeList: [],
    data: [],
    selectedData: []
};

export function reducer(state: State = initialState, action: actions.Actions): State {
    switch (action.type) {
        case actions.INIT_SELECTED_DATASETS:
            return {
                ...state,
                selectedDatasets: action.payload
            };

        case actions.CHANGE_STEP:
            return {
                ...state,
                currentStep: action.payload
            };

        case actions.POSITION_CHECKED:
            return {
                ...state,
                pristine: false,
                positionStepChecked: true
            };

        case actions.DATASETS_CHECKED:
            return {
                ...state,
                datasetsStepChecked: true
            };

        case actions.RETRIEVE_DATASETS_COUNT:
            return {
                ...state,
                datasetsCountIsLoading: true
            };

        case actions.RETRIEVE_DATASETS_COUNT_SUCCESS:
            return {
                ...state,
                datasetsCountIsLoading: false,
                datasetsCountIsLoaded: true,
                datasetsCount: action.payload
            };

        case actions.RETRIEVE_DATASETS_COUNT_FAIL:
            return {
                ...state,
                datasetsCountIsLoading: false
            };

        case actions.UPDATE_SELECTED_DATASETS:
            return {
                ...state,
                selectedDatasets: action.payload
            };

        case actions.RETRIEVE_ATTRIBUTE_LIST_SUCCESS:
            return {
                ...state,
                attributeList: [...state.attributeList, action.payload]
            };

        case actions.RETRIEVE_DATA_SUCCESS:
            const data = [...state.data.filter(d => d.dname !== action.payload.dname), action.payload];
            return {
                ...state,
                data
            };

        case actions.UPDATE_SELECTED_DATA:
            return {
                ...state,
                selectedData: action.payload
            };

        case actions.DESTROY_RESULTS:
            return {
                ...state,
                datasetsCountIsLoaded: false,
                datasetsCount: [],
                data: [],
                selectedData: []
            };

        case actions.RESET_SEARCH:
            return { ...initialState };

        default:
            return state;
    }
}

export const getCurrentStep = (state: State) => state.currentStep;
export const getPositionStepChecked = (state: State) => state.positionStepChecked;
export const getDatasetsStepChecked = (state: State) => state.datasetsStepChecked;
export const getResultStepChecked = (state: State) => state.resultStepChecked;
export const getQueryParams = (state: State) => state.queryParams;
export const getSelectedDatasets = (state: State) => state.selectedDatasets;
export const getDatasetsCountIsLoading = (state: State) => state.datasetsCountIsLoading;
export const getDatasetsCountIsLoaded = (state: State) => state.datasetsCountIsLoaded;
export const getDatasetsCount = (state: State) => state.datasetsCount;
export const getAttributeList = (state: State) => state.attributeList;
export const getData = (state: State) => state.data;
export const getSelectedData = (state: State) => state.selectedData;