import {
  SHORTCUTS_FETCH_REQUEST,
  SHORTCUTS_FETCH_SUCCESS,
  SHORTCUTS_FETCH_FAIL,
  SHORTCUTS_ADD_SUCCESS,
  SHORTCUTS_REMOVE_SUCCESS,
} from '../actions/shortcuts'
import { importFetchedAccount } from '../actions/importer'
import { importGroup } from '../actions/groups'
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'

const initialState = ImmutableMap({
  items: ImmutableList(),
  isLoading: false,
  isFetched: false,
  isError: false,
})

const normalizeShortcut = (shortcut) => {
  if (shortcut.shortcut_type === 'account') {
    importFetchedAccount(shortcut.shortcut)
    return {
      id: shortcut.id,
      shortcut_type: 'account',
      shortcut_id: shortcut.shortcut_id,
      title: shortcut.shortcut.acct,
      image: shortcut.shortcut.avatar_static,
      to: `/${shortcut.shortcut.acct}`,
    }
  } else if (shortcut.shortcut_type === 'group') {
    importGroup(shortcut.shortcut)
    return {
      id: shortcut.id,
      shortcut_type: 'group',
      shortcut_id: shortcut.shortcut_id,
      title: shortcut.shortcut.title,
      image: shortcut.shortcut.cover_image_url,
      to: `/groups/${shortcut.shortcut.id}`,
    }
  }
}

const normalizeShortcuts = (shortcuts) => {
  return fromJS(shortcuts.map((shortcut) => {
    return normalizeShortcut(shortcut)
  }))
}

export default function shortcutsReducer(state = initialState, action) {
  switch(action.type) {
    case SHORTCUTS_FETCH_REQUEST:
      return state.withMutations((map) => {
        map.set('isLoading', true)
        map.set('isFetched', false)
        map.set('isError', false)
      })
    case SHORTCUTS_FETCH_SUCCESS:
      return state.withMutations((map) => {
        map.set('items', normalizeShortcuts(action.shortcuts))
        map.set('isLoading', false)
        map.set('isFetched', true)
        map.set('isError', false)
      })
    case SHORTCUTS_FETCH_FAIL:
      return state.withMutations((map) => {
        map.set('isLoading', false)
        map.set('isFetched', true)
        map.set('isError', true)
      })
    case SHORTCUTS_ADD_SUCCESS:
      return state.update('items', list => list.push(fromJS(normalizeShortcut(action.shortcut))))
    case SHORTCUTS_REMOVE_SUCCESS:
      return state.update('items', list => list.filterNot((item) => {
        return `${item.get('id')}` === `${action.shortcutId}`
      }))
    default:
      return state
  }
}
