/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

const { SELECT_REQUEST } = require("../constants");
const {
  getDisplayedRequests,
  getSortedRequests,
} = require("../selectors/index");

const PAGE_SIZE_ITEM_COUNT_RATIO = 5;

/**
 * Select request with a given id.
 */
function selectRequest(id) {
  return {
    type: SELECT_REQUEST,
    id,
  };
}

/**
 * Select request with a given index (sorted order)
 */
function selectRequestByIndex(index) {
  return (dispatch, getState) => {
    const requests = getSortedRequests(getState());
    let itemId;
    if (index >= 0 && index < requests.size) {
      itemId = requests.get(index).id;
    }
    dispatch(selectRequest(itemId));
  };
}

/**
 * Move the selection up to down according to the "delta" parameter. Possible values:
 * - Number: positive or negative, move up or down by specified distance
 * - "PAGE_UP" | "PAGE_DOWN" (String): page up or page down
 * - +Infinity | -Infinity: move to the start or end of the list
 */
function selectDelta(delta) {
  return (dispatch, getState) => {
    const state = getState();
    const requests = getDisplayedRequests(state);

    if (requests.isEmpty()) {
      return;
    }

    const selIndex = requests.findIndex(r => r.id === state.requests.selectedId);

    if (delta === "PAGE_DOWN") {
      delta = Math.ceil(requests.size / PAGE_SIZE_ITEM_COUNT_RATIO);
    } else if (delta === "PAGE_UP") {
      delta = -Math.ceil(requests.size / PAGE_SIZE_ITEM_COUNT_RATIO);
    }

    const newIndex = Math.min(Math.max(0, selIndex + delta), requests.size - 1);
    const newItem = requests.get(newIndex);
    dispatch(selectRequest(newItem.id));
  };
}

module.exports = {
  selectRequest,
  selectRequestByIndex,
  selectDelta,
};
