import range from 'lodash/range';

const MAX_FIT_PAGES = 7;

export enum PaginationSpecialPages {
  MorePagesLeft = 'morePagesLeft',
  MorePagesRight = 'morePagesRight',
}

export type Pages = number | PaginationSpecialPages;

/**
 * Returns map of pages that must be rendered
 *
 * @param currentPage Current page number starts from 0
 * @param totalPages Total pages count
 */
export function getRanges(currentPage: number, totalPages: number): Pages[] {
  if (totalPages <= MAX_FIT_PAGES) {
    return range(0, Math.max(totalPages, 1));
  }

  const selectedPage =
    currentPage >= totalPages ? totalPages - 1 : Math.min(Math.max(currentPage, 0), Math.max(totalPages, 0));
  const result: Pages[] = [selectedPage];

  for (let i = 1; i < MAX_FIT_PAGES + 1; ++i) {
    if (selectedPage + i < totalPages) {
      result.push(selectedPage + i);
    }
    if (selectedPage - i >= 0 && result.length < MAX_FIT_PAGES) {
      result.unshift(selectedPage - i);
    }
    if (result.length >= MAX_FIT_PAGES) {
      break;
    }
  }

  if (result[0] !== 0) {
    result[0] = 0;
    result[1] = PaginationSpecialPages.MorePagesLeft;
  }
  if (result[result.length - 1] !== totalPages - 1) {
    result[result.length - 1] = totalPages - 1;
    result[result.length - 2] = PaginationSpecialPages.MorePagesRight;
  }

  return result;
}
