<?php
/**
 * @version   $Id: Abstract.php 19264 2014-02-27 23:28:13Z btowles $
 * @author    RocketTheme http://www.rockettheme.com
 * @copyright Copyright (C) 2007 - 2017 RocketTheme, LLC
 * @license   http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
 */

abstract class RokSprocket_Provider_Simple_Storage_Abstract implements RokSprocket_Provider_Simple_Storage_Interface
{
	/**
	 * @param $item_id
	 * @param $module_id
	 *
	 * @return bool|void
	 * @throws RokSprocket_Exception
	 */
	public function removeItem($item_id, $module_id)
	{

		$items              = $this->getItems($module_id);
		$removed_item_order = $items[RokSprocket_Provider_Simple_Storage_Interface::PROVIDER_NAME . '-' . $item_id]->getOrder();
		unset($items[RokSprocket_Provider_Simple_Storage_Interface::PROVIDER_NAME . '-' . $item_id]);
		/** @var $item RokSprocket_Item */
		foreach ($items as $item) {
			if ($item->getOrder() > $removed_item_order) {
				$item->setOrder($item->getOrder() - 1);
			}
		}
		$items->sort(RokSprocket_ItemCollection::SORT_METHOD_MANUAL);
		RokCommon_Session::set('roksprocket.module_' . $module_id, serialize($items));
		return true;
	}

	/**
	 * @param $module_id
	 *
	 * @return RokSprocket_ItemCollection
	 */
	public function getItems($module_id, $displayedIds = array())
	{
		/** @var  RokSprocket_ItemCollection $items */
		if ($this->isAdmin()) {
			$items = RokCommon_Session::get('roksprocket.module_' . $module_id, false);
			if ($items === false) {
				$items = RokCommon_Session::set('roksprocket.module_' . $module_id, serialize($this->getItemsFromDB($module_id)));
			}
			$items = unserialize($items);
		} else {
			$items = $this->getItemsFromDB($module_id, $displayedIds);
		}
		$items->sort(RokSprocket_ItemCollection::SORT_METHOD_MANUAL);
		return $items;
	}

	/**
	 * @return mixed
	 */
	abstract protected function isAdmin();

	/**
	 * @param $module_id
	 *
	 * @return mixed
	 */
	abstract protected function getItemsFromDB($module_id, $displayedIds = array());

	/**
	 * @param $module_id
	 *
	 * @return bool
	 * @throws RokSprocket_Exception
	 */
	public function addNewItem($module_id)
	{

		/** @var RokSprocket_ItemCollection $items */
		$items       = $this->getItems($module_id);
		$new_rs_item = new RokSprocket_Item();
		$new_rs_item->setProvider(RokSprocket_Provider_Simple_Storage_Interface::PROVIDER_NAME);
		$new_rs_item->setId($items->getNextId());
		$new_rs_item->setParam('_article_title', rc__('ROKSPROCKET_NEW_SIMPLE_ITEM_TITLE', $new_rs_item->getId()));
		$new_rs_item->setTitle(rc__('ROKSPROCKET_NEW_SIMPLE_ITEM_TITLE', $new_rs_item->getId()));
		$new_rs_item->setOrder(0);
		/** @var RokSprocket_Item $item */
		foreach ($items as $item) {
			$item->setOrder($item->getOrder() + 1);
		}
		$items[$new_rs_item->getArticleId()] = $new_rs_item;
		$items->sort(RokSprocket_ItemCollection::SORT_METHOD_MANUAL);
		RokCommon_Session::set('roksprocket.module_' . $module_id, serialize($items));
		return true;
	}

	/**
	 * @param array $data
	 *
	 * @return RokSprocket_ItemCollection
	 */
	protected function convertRawToItems(array $data)
	{
		$collection = new RokSprocket_ItemCollection();
		$dborder    = 0;
		foreach ($data as $raw_item) {
			$item                              = $this->convertRawToItem($raw_item, $dborder);
			$collection[$item->getArticleId()] = $item;
			$dborder++;
		}
		return $collection;
	}

	/**
	 * @param     $raw_item
	 * @param int $dborder
	 *
	 * @return \RokSprocket_Item
	 */
	protected function convertRawToItem($raw_item, $dborder = 0)
	{
		$item = new RokSprocket_Item();
		$item->setProvider(RokSprocket_Provider_Simple_Storage_Interface::PROVIDER_NAME);
		$item->setId($raw_item->id);

		$params = RokCommon_JSON::decode($raw_item->params, null, true);
		if ($params !== false && is_array($params) && array_key_exists('_article_title', $params)) {
			$item->setTitle($params['_article_title']);
		} else {
			$item->setTitle('Simple Item');
		}
		return $item;
	}
}
