import store from '../store';
import Immutable from 'immutable';
import { changeFilter } from './feeds';
import { loadSecurity } from './securities';
import { fetchWatchlists } from './watchlists';
import { startTutorial } from './tutorials';
import { FeedFilter } from '../reducers/filters';
import { isPopout, popoutEvent } from 'utils/popouts';
import { addWidgetWatchlist, addWidgetNewsfeed, addWidgetCalendar, addWidgetSecurity } from './widgets';

// import { handleAPIResponse, getAuthKey } from 'utils/session';

// The version of the stored layout. Change this whenever something needs to be
// changed when loading an old layout.
export const LAYOUT_VERSION = 3;

export const SWITCH_WORKSPACE = 'SWITCH_WORKSPACE';
export function switchWorkspace(index) {
  store.dispatch({
    type: SWITCH_WORKSPACE,
    index
  });
}

export const ADD_WORKSPACE = 'ADD_WORKSPACE';
export function addWorkspace() {
  store.dispatch({
    type: ADD_WORKSPACE
  });
  const workspaces = store.getState().workspaces.get('workspaceList').size;
  switchWorkspace(workspaces - 1);
  bzTrack.track('Workspace: Added', {workspaces});
}

export const CHANGE_WORKSPACE_NAME = 'CHANGE_WORKSPACE_NAME';
export function changeWorkspaceName(name) {
  store.dispatch({
    type: CHANGE_WORKSPACE_NAME,
    name
  });
  bzTrack.track('Workspace: ChangedName', {
    workspaces: store.getState().workspaces.get('workspaceList').size,
    name
  });
}

export const REMOVE_WIDGET = 'REMOVE_WIDGET';
export function removeWidget(widgetId) {
  store.dispatch({
    type: REMOVE_WIDGET,
    widgetId
  });
  bzTrack.track('Workspace: Widget Removed', {widgetId});
}

export function saveLayout() {
  const layout = store.getState().workspaces.toJS();
  localStorage.layout = JSON.stringify(layout);
  localStorage.layoutVersion = LAYOUT_VERSION;

  bzTrack.track('Workspace: Workspaces Saved To LocalStorage', {
    layout,
    layoutVersion: LAYOUT_VERSION
  });
}

export const LOAD_LAYOUT = 'LOAD_LAYOUT';
export function loadSavedLayout() {
  if (localStorage.layout) {
    const layout = JSON.parse(localStorage.layout);
    // Default to 0 if no version was saved
    const layoutVersion = parseInt(localStorage.layoutVersion, 10) || 0;
    store.dispatch({
      type: LOAD_LAYOUT,
      layout,
      layoutVersion
    });
    bzTrack.track('Workspace: Workspaces Loaded From LocalStorage', {
      layout,
      layoutVersion
    });
  }
}

export const REMOVE_WORKSPACE = 'REMOVE_WORKSPACE';
export function removeWorkspace(index) {
  store.dispatch({
    type: REMOVE_WORKSPACE,
    workspaceIndex: index
  });
  const workspaces = store.getState().workspaces.get('workspaceList').size;
  bzTrack.track('Workspace: Removed', {workspaces});
}

export function addWidget(widgetType) {
  const tutorials = store.getState().tutorials;
  if (!localStorage.tutorials) {
    startTutorial('main', tutorials);
    startTutorial(widgetType, tutorials);
  } else {
    const isTutCompleted = JSON.parse(localStorage.tutorials)[widgetType];
    if (!isTutCompleted) { startTutorial(widgetType, tutorials); }
  }
  switch (widgetType) {
  case 'calendar':
    store.dispatch(addWidgetCalendar());
    break;
  case 'security':
    store.dispatch(addWidgetSecurity());
    break;
  case 'watchlist':
    store.dispatch(addWidgetWatchlist());
    break;
  case 'newsfeed':
  default:
    store.dispatch(addWidgetNewsfeed());
    break;
  }

  bzTrack.track('Widget: Added ' + widgetType.charAt(0).toUpperCase() + widgetType.substring(1));
}

export function openSecurity(symbol) {
  if (isPopout()) {
    popoutEvent('security', Immutable.fromJS({symbol}));
  } else {
    const workspaces = store.getState().workspaces;
    const workspace = workspaces.getIn(['workspaceList', workspaces.get('activeWorkspace')]);
    const securityWidgets = workspace.get('widgets').filter(widget => widget.get('type') === 'security');
    if (securityWidgets.size) {
      store.dispatch(loadSecurity(securityWidgets.get(0).get('id'), symbol));
    } else if (workspace.get('widgets').size > 3) {
      // open new workspace for widget
      addWorkspace();
      store.dispatch(addWidgetSecurity(symbol));
    } else {
      store.dispatch(addWidgetSecurity(symbol));
    }
  }
  bzTrack.track('Widget: Opened TickerPage', {symbol});
}
