import { createAsyncAction, createSyncAction } from 'utils/actions';
import { fetchCalendar } from 'services/calendarapi';
import { standardWidgetAction } from './widgets';
import {
  fetchQuote,
  fetchFinancials,
  fetchChart,
  fetchCorporateLogo,
  fetchAverages,
  fetchOwnership
} from 'services/apis';
import { getWidgetById } from 'utils/workspaces';
import { loadNewCalendar } from './calendars';
import { CalendarParameters } from '../reducers/calendars';
// TODO: Remove isPopout import after calendar reducer refactor
import { isPopout } from 'utils/popouts';
import { newSecurity } from '../reducers/securities';

// ********* SECURITY WIDGET ACTIONS ********* //

export const SECURITY_CHANGE_SECURITY = 'SECURITY_CHANGE_SECURITY';
export const changeSecurity = createSyncAction(SECURITY_CHANGE_SECURITY, (widgetId, symbol) => {
  bzTrack.track('TickerPage: ChangeSymbol', {
    symbol: symbol
  });
  return standardWidgetAction(widgetId, { symbol });
});

export const SECURITY_TOGGLE_DISPLAY = 'SECURITY_TOGGLE_DISPLAY';
export const toggleDisplay = createSyncAction(SECURITY_TOGGLE_DISPLAY, (widgetId, display) => {
  bzTrack.track('TickerPage: Menu Toggle Settings', {
    column: display
  });
  return standardWidgetAction(widgetId, { display });
});

export const SECURITY_CHANGE_TAB = 'SECURITY_CHANGE_TAB';
export const changeSecurityTab = createSyncAction(SECURITY_CHANGE_TAB, (widgetId, newTab) => {
  return standardWidgetAction(widgetId, { newTab });
});

export const SECURITY_LOAD_QUOTE = 'SECURITY_LOAD_QUOTE';
export const loadQuote = createAsyncAction(SECURITY_LOAD_QUOTE, (widgetId, symbol) => {
  return fetchQuote(symbol)
  .then(quote => standardWidgetAction(widgetId, { quote }));
}, standardWidgetAction);

export const SECURITY_LOAD_FINANCIALS = 'SECURITY_LOAD_FINANCIALS';
export const loadFinancials = createAsyncAction(SECURITY_LOAD_FINANCIALS, (widgetId, symbol) => {
  return fetchFinancials(symbol)
  .then(financials => standardWidgetAction(widgetId, { financials }));
}, standardWidgetAction);

export const SECURITY_LOAD_AVERAGES = 'SECURITY_LOAD_AVERAGES';
export const loadAverages = createAsyncAction(SECURITY_LOAD_AVERAGES, (widgetId, symbol) => {
  return fetchAverages(symbol)
  .then(averages => standardWidgetAction(widgetId, { averages }));
}, standardWidgetAction);

export const SECURITY_LOAD_OWNERSHIP = 'SECURITY_LOAD_OWNERSHIP';
export const loadOwnership = createAsyncAction(SECURITY_LOAD_OWNERSHIP, (widgetId, symbol) => {
  return fetchOwnership(symbol)
  .then(ownership => standardWidgetAction(widgetId, { ownership }));
}, standardWidgetAction);

export const SECURITY_LOAD_CHART = 'SECURITY_LOAD_CHART';
export const loadChart = createAsyncAction(SECURITY_LOAD_CHART, (widgetId, symbol, period) => {
  return fetchChart(symbol, period)
  .then(points => standardWidgetAction(widgetId, { points }));
}, standardWidgetAction);

export const SECURITY_LOAD_LOGO = 'SECURITY_LOAD_LOGO';
export const loadCorporateLogo = createAsyncAction(SECURITY_LOAD_LOGO, (widgetId, symbol) => {
  return fetchCorporateLogo(symbol)
  .then(logo => standardWidgetAction(widgetId, { logo }));
}, standardWidgetAction);


// ********* SECURITY WIDGET ACTION CREATORS ********* //

export function updateChart(widgetId) {
  return (dispatch, getState) => {
    const sec = getWidgetById(widgetId, getState());
    if (!sec) {
      /* eslint-disable no-console */
      console.error('Could not update chart for security widget with id ', widgetId);
      /* eslint-enable no-console */
      return dispatch;
    }
    const symbol = sec.get('symbol');
    const period = sec.get('chart').get('period');

    dispatch(loadChart(widgetId, symbol, period));
  };
}

// Changes the security's symbol and loads everything it needs
export function loadSecurity(widgetId, symbol) {
  return dispatch => {
    dispatch(changeSecurity(widgetId, symbol));
    dispatch(loadQuote(widgetId, symbol));
    dispatch(loadFinancials(widgetId, symbol));
    dispatch(loadCorporateLogo(widgetId, symbol));
    dispatch(loadAverages(widgetId, symbol));
    dispatch(loadOwnership(widgetId, symbol));
  };
}
