import {
    REQUEST_PACKAGE_DETAILS,
    RECIEVE_PACKAGE_DETAILS,
    SELECT_OPTION,
    SELECT_AGREEMENT,
    SELECT_ADDITIONAL,
    REMOVE_ADDITIONAL,
    CLEAR_SELECTIONS
} from '../../constants/coMarketConstants';

const moduleReducers = {};

moduleReducers[REQUEST_PACKAGE_DETAILS] = (state, action) => {
    return Object.assign({}, state, {
        isLoading: action.isLoading
    });
};

moduleReducers[RECIEVE_PACKAGE_DETAILS] = (state, action) => {
    return Object.assign({}, state, {
        selectedPackage: action.selectedPackage,
        isLoading: action.isLoading
    });
};

moduleReducers[CLEAR_SELECTIONS] = (state, action) => {
    return Object.assign({}, state, {
        selectedOptions: action.selectedOptions,
        selectedAdditionals: action.selectedAdditionals,
        selectedAgreement: action.selectedAgreement
    });
};

moduleReducers[SELECT_AGREEMENT] = (state, action) => {
    return Object.assign({}, state, {
        selectedAgreement: action.selectedAgreement
    });
};

moduleReducers[SELECT_OPTION] = (state, action) => {
    const newOptions = Object.assign({}, state.selectedOptions, action.selectedOptions);
    return Object.assign({}, state, {
        selectedOptions: newOptions
    });
};

moduleReducers[SELECT_ADDITIONAL] = (state, action) => {
    const newState = {selectedAdditionals : []};
    newState.selectedAdditionals = state.selectedAdditionals ? newState.selectedAdditionals.concat(state.selectedAdditionals) : [];
    if(!newState.selectedAdditionals.includes(action.selectedAdditonal)){
        newState.selectedAdditionals.push(action.selectedAdditonal);
    }

    return Object.assign({}, state, newState);
};

moduleReducers[REMOVE_ADDITIONAL] = (state, action) => {
    const newState = {selectedAdditionals : []};
    newState.selectedAdditionals = state.selectedAdditionals ? newState.selectedAdditionals.concat(state.selectedAdditionals) : [];
    const indexOfElement = newState.selectedAdditionals.indexOf(action.selectedAdditonal);
    if(indexOfElement > -1){
        newState.selectedAdditionals.splice(indexOfElement, 1);
    }

    return Object.assign({}, state, newState);
};

const coMarketPackageDetailsReducer = (state = {}, action) => {

    return moduleReducers[action.type] ? moduleReducers[action.type](state, action) : state;
};

export default coMarketPackageDetailsReducer;
