import { TrayAction } from '../actions'
import {
    OPEN_TRAY_ITEM,
    CLOSE_TRAY_ITEM,
    TOGGLE_TRAY_ITEM,
} from '../constants'
import { TrayModel, TrayItemModel } from '../data'

export interface TrayState {
    [trayName: string]: TrayModel
}

export const initiaTrayState: TrayState = {}

export const trayReducer = (state = initiaTrayState,
                            action: TrayAction): TrayState => {
    switch (action.type) {
        case OPEN_TRAY_ITEM: {
            return setItemOpenState(state, action, true)
        }
        case CLOSE_TRAY_ITEM: {
            return setItemOpenState(state, action, false)
        }
        case TOGGLE_TRAY_ITEM: {
            const itemState = (state[action.trayName] || {})[action.itemName]
            return setItemOpenState(state, action, itemState && itemState.open ? false : true)
        }
        default: {
            return state
        }
    }
}

const setItemOpenState = (state = initiaTrayState, action: TrayAction, open: boolean) => {
    const currentTrayState = state[action.trayName] || {}

    return {
        ...state,
        [action.trayName]: {
            ...state[action.trayName],
            [action.itemName]: {
                ...currentTrayState[action.itemName],
                open,
            },
        },
    }
}