import Immutable from 'immutable';
import {
  SECURITY_CHANGE_SECURITY,
  SECURITY_TOGGLE_DISPLAY,
  SECURITY_CHANGE_TAB,
  SECURITY_LOAD_QUOTE,
  SECURITY_LOAD_FINANCIALS,
  SECURITY_LOAD_AVERAGES,
  SECURITY_LOAD_OWNERSHIP,
  SECURITY_LOAD_CHART,
  SECURITY_LOAD_LOGO,
} from 'actions/securities';

import {
  ACTION_STARTED,
  ACTION_SUCCEEDED,
  ACTION_FAILED,
  unstandardizeAction
} from 'utils/actions';

import {
  Calendar,
  CalendarParameters,
  calendarsReducer
} from './calendars';


// Initial security symbol
const initialSymbol = 'AAPL';
// Initial security symbol
const initialTab = 'overview';

export const Display = new Immutable.Record({
  barTab: initialTab,
  chart: true,
  news: true,
  events: true,
  stats: true,
  profile: true
});

export const Chart = new Immutable.Record({
  period: null,
  chartType: null,
  points: new Immutable.List()
});

// Make sure that these fields don't intersect with any in the Calendar record
// Otherwise the calendarsReducer might change them
export const Security = new Immutable.Record({
  loadingQuote: false,
  loadingFinancials: false,
  loadingOwnership: false,
  loadingAverages: false,
  loadingChart: false,
  loadingLogo: false,
  display: new Display(),
  symbol: initialSymbol,
  calendar: new Calendar({
    parameters: new CalendarParameters({
      symbol: initialSymbol,
      calendarType: 'earnings',
      dateStart: null,
      dateEnd: null,
    })
  }),
  quote: new Immutable.Map({}),
  financials: new Immutable.Map({}),
  averages: new Immutable.Map({}),
  ownership: new Immutable.Map({}),
  chart: new Chart(),
  logo: null
});

export function newSecurity(symbol) {
  return new Security({
    symbol: symbol || initialSymbol,
    calendar: new Calendar({
      parameters: new CalendarParameters({
        symbol: symbol || initialSymbol,
        calendarType: 'earnings',
        dateStart: null,
        dateEnd: null,
      })
    }),
  });
}

export function securityReducer(oldSecurity = new Security(), action) {
  let security = oldSecurity;
  // Use the calendar reducer to handle calendar related stuff. This gets us
  // stuff like loading additional pages of events in a DRY way.


  switch (action.type) {
  case SECURITY_LOAD_QUOTE:
    if (action.status === ACTION_STARTED) {
      security = security.set('loadingQuote', true);
    } else {
      security = security.set('loadingQuote', false);
      if (action.status === ACTION_SUCCEEDED) {
        security = security.set('quote', new Immutable.Map(action.payload.quote));
      }
    }
    break;
  case SECURITY_LOAD_FINANCIALS:
    if (action.status === ACTION_STARTED) {
      security = security.set('loadingFinancials', true);
    } else {
      security = security.set('loadingFinancials', false);
      if (action.status === ACTION_SUCCEEDED) {
        security = security.set('financials', new Immutable.Map(action.payload.financials));
      }
    }
    break;
  case SECURITY_LOAD_AVERAGES:
    if (action.status === ACTION_STARTED) {
      security = security.set('loadingAverages', true);
    } else {
      security = security.set('loadingAverages', false);
      if (action.status === ACTION_SUCCEEDED) {
        security = security.set('averages', new Immutable.Map(action.payload.averages));
      }
    }
    break;
  case SECURITY_LOAD_OWNERSHIP:
    if (action.status === ACTION_STARTED) {
      security = security.set('loadingOwnership', true);
    } else {
      security = security.set('loadingOwnership', false);
      if (action.status === ACTION_SUCCEEDED) {
        security = security.set('ownership', new Immutable.Map(action.payload.ownership));
      }
    }
    break;
  case SECURITY_LOAD_CHART:
    if (action.status === ACTION_STARTED) {
      security = security.set('loadingChart', true)
        .setIn(['chart', 'chartType'], action.chartType)
        .setIn(['chart', 'period'], action.period);
    } else {
      security = security.set('loadingChart', true);
      if (action.status === ACTION_SUCCEEDED) {
        security = security.setIn(['chart', 'points'], new Immutable.List(action.points));
      }
    }
    break;
  case SECURITY_CHANGE_SECURITY:
    if (action.status === ACTION_SUCCEEDED) {
      security = security.set('symbol', action.payload.symbol)
        .setIn(['calendar', 'parameters', 'symbol'], action.payload.symbol);
    }
    break;
  case SECURITY_TOGGLE_DISPLAY:
    if (action.status === ACTION_SUCCEEDED) {
      security = security.setIn(['display', action.payload.display], !security.getIn(['display', action.payload.display]));
    }
    break;
  case SECURITY_LOAD_LOGO:
    if (action.status === ACTION_STARTED) {
      security = security.set('loadingLogo', true);
    } else {
      security = security.set('loadingLogo', false);
      if (action.status === ACTION_SUCCEEDED) {
        security = security.set('logo', action.payload.logo);
      }
    }
    break;
  default:
    break;
  }
  return security;
}
