import { List } from 'immutable';

import { blockUI, unblockUI } from './index.js';
import { fetchEvents as fetchEventsApi } from '../api/events.js';
import {
  EVENTS_LOAD_FAILED,
  EVENTS_LOADED,
  GET_EVENTS,
} from '../constants/actionTypes.js';
import Event from '../domain/Event.js';
import { getAuthToken } from '../selectors/auth.js';

const eventsLoaded = (payload) => ({ type: EVENTS_LOADED, payload });

const eventsLoadError = (payload) => ({ type: EVENTS_LOAD_FAILED, payload });

const eventsFetchSuccess = (items) => (dispatch) => {
  const payload = List(items).map((i) => Event.fromJS(i));

  dispatch(eventsLoaded(payload));
  dispatch(unblockUI);
};

const eventsFetchFailure = (error) => (dispatch) => {
  console.error('[actions::events::eventsFetchFailure]', error);
  dispatch(eventsLoadError(error));
  dispatch(unblockUI);
};

export const fetchEvents = () => (dispatch, getState) => {
  const authToken = getAuthToken(getState());

  fetchEventsApi(authToken)
    .then(payload => dispatch(eventsFetchSuccess(payload)))
    .catch(err => dispatch(eventsFetchFailure(err)));
};
