<?php

/**
 * Description of Reorder
 *
 * @author Arkadiusz Rychlik <a.rychlik at eppe.com.pl>
 */
trait Rtn_CRUD_Trait_Reorder {

	/**
	 * @return int Zwraca następny numer order, który powinien być użyty przy dodawaniu kolejnego wiersza do tabeli
	 */
	protected function _getNextOrderNumber() {
		$row = R::getRow("SELECT MAX(`order`) AS lastOrder FROM {$this->beanName}");

		return $row['lastOrder'] + 1;
	}

	protected function _replaceElements($oldRowId, $newRowId) {
		$dba = Zend_Db_Table::getDefaultAdapter();

		if ($this->multiLang) {
			$langCode = Core_Lang::getLangCode();
			$sqlOldId = "SELECT `order` FROM {$this->grid->dbTableName} WHERE id = {$oldRowId} AND lang_code='{$langCode}'";
			$sqlNewId = "SELECT `order` FROM {$this->grid->dbTableName} WHERE id = {$newRowId} AND lang_code='{$langCode}'";
		}
		else {
			$sqlOldId = "SELECT `order` FROM {$this->grid->dbTableName} WHERE id = {$oldRowId}";
			$sqlNewId = "SELECT `order` FROM {$this->grid->dbTableName} WHERE id = {$newRowId}";
		}

		$oldOrderNum = $dba->fetchRow($sqlOldId);
		$oldOrderNum = $oldOrderNum['order'];
		$newOrderNum = $dba->fetchRow($sqlNewId);
		$newOrderNum = $newOrderNum['order'];

		if ($this->multiLang) {
			$sqlOld = <<<EOF
			UPDATE {$this->grid->dbTableName}
				SET `order` = {$oldOrderNum}
			WHERE
				id = {$newRowId} AND lang_code='{$langCode}'
EOF;
			$sqlNew = <<<EOF
			UPDATE {$this->grid->dbTableName}
				SET `order` = {$newOrderNum}
			WHERE
				id = {$oldRowId} AND lang_code='{$langCode}'
EOF;
		}
		else {
			$sqlOld = <<<EOF
			UPDATE {$this->grid->dbTableName}
				SET `order` = {$oldOrderNum}
			WHERE
				id = {$newRowId}
EOF;
			$sqlNew = <<<EOF
			UPDATE {$this->grid->dbTableName}
				SET `order` = {$newOrderNum}
			WHERE
				id = {$oldRowId}
EOF;
		}

		$dba->beginTransaction();
		try {
			$dba->query($sqlOld);
			$dba->query($sqlNew);
			$dba->commit();
		}
		catch (Exception $e) {
			$dba->rollBack();
			throw $e;
		}
	}

	/**
	 * Przestawia element (kolejność)
	 * @param int $oldId id elementu przestawianego
	 * @param int $newId id elementu na którego miejsce przestawiamy element
	 * @throws Exception
	 */
	protected function _reorderElement($oldId, $newId) {
		$dba = Zend_Db_Table::getDefaultAdapter();

		$select = $dba->select()->from($this->grid->dbTableName, 'order')->where('id = ' . $oldId);
		$oldOrder = $dba->fetchOne($select);

		$select = $dba->select()->from($this->grid->dbTableName, 'order')->where('id = ' . $newId);
		$newOrder = $dba->fetchOne($select);

		if ($newOrder < $oldOrder) {
			$sql1 = <<<EOF
				UPDATE {$this->grid->dbTableName}
					SET `order` = `order` + 1
				WHERE
					`order` >= {$newOrder} AND `order` < {$oldOrder}
EOF;
			$sql2 = <<<EOF
				UPDATE {$this->grid->dbTableName}
					SET	`order` = {$newOrder}
				WHERE
					id = {$oldId}
EOF;
		}
		else {
			$sql1 = <<<EOF
				UPDATE {$this->grid->dbTableName}
					SET `order` = `order` - 1
				WHERE
					`order` >= {$oldOrder} AND `order` <= {$newOrder}
EOF;
			$sql2 = <<<EOF
				UPDATE {$this->grid->dbTableName}
					SET `order` = {$newOrder}
				WHERE
					id = {$oldId}
EOF;
		}

		$dba->beginTransaction();
		try {
			$dba->query($sql1);
			$dba->query($sql2);
			$dba->commit();
		}
		catch (Exception $e) {
			$dba->rollBack();
			throw $e;
		}
	}

}
