import Immutable from 'immutable';
import find from 'lodash/findIndex';

import { widgetAddReducer } from './widgets';
import { widgetMethodsReducer } from './workspaces';
import {
  WATCHLIST_POPOUT_TOGGLE_DISPLAY,
  POPOUT_SELECT_WATCHLIST
} from 'actions/watchlists';
import {
  FEED_POPOUT_CHANGE_FILTERS,
  FEED_POPOUT_CHANGE_SPACING,
  FEED_POPOUT_CHANGE_TEXT,
  FEED_POPOUT_CHANGE_THEME_COLOR,
  FEED_POPOUT_CHANGE_THEME_TARGET,
  FEED_POPOUT_ADD_THEME,
  FEED_POPOUT_REMOVE_THEME
} from 'actions/feeds';
import {
  SECURITY_POPOUT_CHANGE_SYMBOL,
  SECURITY_POPOUT_TOGGLE_DISPLAY
} from 'actions/securities';
import {
  ADD_POPOUT_CALENDAR,
  ADD_POPOUT_NEWSFEED,
  ADD_POPOUT_SECURITY,
  ADD_POPOUT_WATCHLIST,
  REMOVE_POPOUT
} from 'actions/popouts';

export default function popoutsReducer(oldPopouts = new Immutable.List([]), action) {
  let popouts = oldPopouts;
  if ('payload' in action && 'isPopout' in action.payload && action.payload.isPopout) {
    popouts = popouts.setIn([0, 'data'], widgetMethodsReducer(popouts.getIn([0, 'data']), action));
  }
  switch (action.type) {
    // Feed Widget Events
  case FEED_POPOUT_CHANGE_FILTERS:
  case FEED_POPOUT_CHANGE_SPACING:
  case FEED_POPOUT_CHANGE_TEXT:
  case FEED_POPOUT_CHANGE_THEME_COLOR:
  case FEED_POPOUT_CHANGE_THEME_TARGET:
  case FEED_POPOUT_ADD_THEME:
  case FEED_POPOUT_REMOVE_THEME:
  case SECURITY_POPOUT_CHANGE_SYMBOL:
  case SECURITY_POPOUT_TOGGLE_DISPLAY:
  case WATCHLIST_POPOUT_TOGGLE_DISPLAY:
  case POPOUT_SELECT_WATCHLIST:
    return popouts
      .setIn([0, 'data'], widgetMethodsReducer(popouts.getIn([0, 'data']), action));
  case ADD_POPOUT_CALENDAR:
  case ADD_POPOUT_NEWSFEED:
  case ADD_POPOUT_SECURITY:
  case ADD_POPOUT_WATCHLIST:
    const nextId = (Math.random() + 1).toString(36).substring(7);
    const newPopout = widgetAddReducer(nextId, action);
    return popouts.push(newPopout);
  case REMOVE_POPOUT:
    const widgetId = action.id;
    const deleteIndex = popouts.findIndex(popout => {
      return popout.id === widgetId;
    });
    return popouts.delete(deleteIndex);
  default:
    return popouts;
  }
}
