import * as ModalActions from '../actions/modal'
import { ModalState } from '../data'

const initialModalState: ModalState = {
    modalType: '',
    modalProps: {},
    modalHistory: [],
}

export const modalReducer = (state = initialModalState,
                             action: ModalActions.ModalAction): ModalState => {
    switch (action.type) {
        case ModalActions.SHOW_MODAL:
            return showModal(state, action)
        case ModalActions.HIDE_MODAL:
            return hideModal(state, action)
        case ModalActions.UPDATE_MODAL_PROPS:
            return updateModal(state, action)
        default:
            return state
    }
}

const showModal = (state = initialModalState, action: ModalActions.ShowModalAction) => {
    const modalHistory = state.modalHistory.slice(0)

    if (state.modalType !== '') {
        modalHistory.push({ modalType: state.modalType, modalProps: state.modalProps })
    }

    return { ...state, modalType: action.modalType, modalProps: action.modalProps, modalHistory }
}

const hideModal = (state = initialModalState, action: ModalActions.HideModalAction) => {
    const modalHistory = state.modalHistory.slice(0)
    const oldState = (modalHistory.length > 0) ? modalHistory.pop() : null

    if (oldState) {
        return {
            ...state,
            modalType: oldState.modalType,
            modalProps: oldState.modalProps,
            modalHistory,
        }
    } else {
        return initialModalState
    }
}

const updateModal = (state = initialModalState, action: ModalActions.UpdateModalPropsAction) =>
    ({ ...state, modalProps: action.modalProps })