import URI from 'urijs';
import { push } from 'connected-react-router';
import { get } from 'foremanReact/redux/API';
import {
  selectIsAllSelected,
  selectQueryParams,
} from './InsightsTableSelectors';
import { INSIGHTS_PATH } from '../../InsightsCloudSyncConstants';
import {
  columns,
  INSIGHTS_HITS_API_KEY,
  INSIGHTS_HITS_PATH,
  INSIGHTS_SET_SELECTED_IDS,
  INSIGHTS_SET_SELECT_ALL_ALERT,
  INSIGHTS_SET_SELECT_ALL,
} from './InsightsTableConstants';

export const fetchInsights = (queryParams = {}) => (dispatch, getState) => {
  const state = getState();
  const { page, perPage, query, sortBy, sortOrder } = {
    ...selectQueryParams(state),
    ...queryParams,
  };

  dispatch(
    get({
      key: INSIGHTS_HITS_API_KEY,
      url: INSIGHTS_HITS_PATH,
      params: {
        page,
        per_page: perPage,
        search: query,
        order: `${sortBy} ${sortOrder}`,
      },
    })
  );

  const uri = new URI();
  uri.search({
    page,
    per_page: perPage,
    search: query,
    sort_by: sortBy,
    sort_order: sortOrder,
  });

  dispatch(
    push({
      pathname: INSIGHTS_PATH,
      search: uri.search(),
    })
  );

  const isAllSelected = selectIsAllSelected(state);
  if (isAllSelected) {
    dispatch(clearAllSelection());
  } else {
    dispatch(setSelectAllAlert(false));
    dispatch(setSelectAll(false));
  }
};

export const setSelectAllAlert = showSelectAllAlert => ({
  type: INSIGHTS_SET_SELECT_ALL_ALERT,
  payload: { showSelectAllAlert },
});

export const selectByIds = selectedIds => ({
  type: INSIGHTS_SET_SELECTED_IDS,
  payload: { selectedIds },
});

export const setSelectAll = isAllSelected => ({
  type: INSIGHTS_SET_SELECT_ALL,
  payload: { isAllSelected },
});

export const selectAll = () => setSelectAll(true);

export const clearAllSelection = () => dispatch => {
  dispatch(selectByIds({}));
  dispatch(setSelectAllAlert(false));
  dispatch(setSelectAll(false));
};

export const onTableSort = (_event, index, direction) => {
  // The checkbox column shifts the data columns by 1;
  const { sortKey } = columns[index - 1];
  return fetchInsights({
    sortBy: sortKey,
    sortOrder: direction,
    page: 1,
  });
};

export const onTableSetPage = (_event, pageNumber) =>
  fetchInsights({ page: pageNumber });

export const onTablePerPageSelect = (_event, perPageNumber) =>
  fetchInsights({ perPage: perPageNumber });

export const onTableSelect = (
  _event,
  isSelected,
  rowId,
  results,
  prevSelectedIds
) => dispatch => {
  const selectedIds = { ...prevSelectedIds };
  let showSelectAllAlert = false;
  // for select all
  if (rowId === -1) {
    if (!isSelected) return dispatch(clearAllSelection());

    results.forEach(row => {
      selectedIds[row.id] = true;
    });

    showSelectAllAlert = true;
  } else {
    isSelected
      ? (selectedIds[results[rowId].id] = true)
      : delete selectedIds[results[rowId].id];
  }

  dispatch(selectByIds(selectedIds));
  dispatch(setSelectAllAlert(showSelectAllAlert));
  return null;
};