<?php

namespace SGalinski\SgJobs\ViewHelpers\Backend\Widget\Controller;

/***************************************************************
 *  Copyright notice
 *
 *  (c) sgalinski Internet Services (https://www.sgalinski.de)
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

/**
 * PaginateController
 */
class PaginateController extends \TYPO3\CMS\Fluid\ViewHelpers\Be\Widget\Controller\PaginateController {
	/**
	 * @var mixed
	 */
	protected $objects;

	/**
	 * Renders the paginator
	 *
	 * @param int $currentPage
	 * @return void
	 */
	public function indexAction($currentPage = 1) {
		// set current page
		$this->currentPage = (int) $currentPage;
		if ($this->currentPage < 1) {
			$this->currentPage = 1;
		}

		if ($this->currentPage > $this->numberOfPages) {
			// set $modifiedObjects to NULL if the page does not exist
			$modifiedObjects = NULL;
		} else {
			// modify query
			$this->itemsPerPage = (int) $this->configuration['itemsPerPage'];
			$this->offset = $this->itemsPerPage * ($this->currentPage - 1);
			if (\is_array($this->objects)) {
				$modifiedObjects = [];
				for ($index = $this->offset; $index < $this->offset + $this->itemsPerPage; $index++) {
					if (isset($this->objects[$index])) {
						$modifiedObjects[] = $this->objects[$index];
					} else {
						break;
					}
				}
			} else {
				$query = $this->objects->getQuery();
				$query->setLimit($this->itemsPerPage);
				if ($this->currentPage > 1) {
					$query->setOffset($this->offset);
				}

				$modifiedObjects = $query->execute();
			}
		}
		$this->view->assign(
			'contentArguments',
			[
				$this->widgetConfiguration['as'] => $modifiedObjects
			]
		);
		$this->view->assign('configuration', $this->configuration);
		$this->view->assign('pagination', $this->buildPagination());
	}

	/**
	 * Returns an array with the keys "pages", "current", "numberOfPages",
	 * "nextPage" & "previousPage"
	 *
	 * @return array
	 */
	protected function buildPagination() {
		$pagination = parent::buildPagination();
		$pagination['totalObjects'] = is_countable($this->objects) ? \count($this->objects) : 0;
		return $pagination;
	}
}