<?php

/**
 * @version   $Id: K2.php 19225 2014-02-27 00:15:10Z btowles $
 * @author    RocketTheme http://www.rockettheme.com
 * @copyright Copyright (C) 2007 - 2014 RocketTheme, LLC
 * @license   http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
 */
class RokSprocket_Provider_K2 extends RokSprocket_Provider_AbstarctJoomlaBasedProvider
{

	protected static $available;
	protected static $extra_fields;

	/**
	 * @static
	 * @return bool
	 */
	public static function isAvailable()
	{
		if (isset(self::$available)) {
			return self::$available;
		}


		if (!class_exists('JFactory')) {
			self::$available = false;
		} else {
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true);

			$query->select('a.extension_id');
			$query->from('#__extensions AS a');
			$query->where('a.type = "component"');
			$query->where('a.element = "com_k2"');
			$query->where('a.enabled = 1');

			$db->setQuery($query);

			if ($db->loadResult()) {
				self::$available = true;
			} else {
				self::$available = false;
			}
		}
		return self::$available;
	}

	/**
	 * @param array $filters
	 * @param array $sort_filters
	 */
	public function __construct($filters = array(), $sort_filters = array())
	{
		parent::__construct('k2');
		$this->setFilterChoices($filters, $sort_filters);
	}

	/**
	 * @param     $raw_item
	 * @param int $dborder
	 *
	 * @return \RokSprocket_Item
	 */
	protected function convertRawToItem($raw_item, $dborder = 0)
	{
		//$textfield = $this->params->get('k2_articletext_field', '');

		$item = new RokSprocket_Item();

		$item->setProvider($this->provider_name);
		$item->setId($raw_item->id);
		$item->setAlias($raw_item->alias);
		$item->setAuthor(($raw_item->created_by_alias) ? $raw_item->created_by_alias : $raw_item->author_name);
		$item->setTitle($raw_item->title);
		$item->setDate($raw_item->created);
		$item->setPublished(($raw_item->published == 1) ? true : false);
		$item->setCategory($raw_item->category_title);
		$item->setHits($raw_item->hits);
		$item->setRating($raw_item->rating);
		$item->setMetaKey($raw_item->metakey);
		$item->setMetaDesc($raw_item->metadesc);
		$item->setMetaData($raw_item->metadata);
		$item->setPublishUp($raw_item->publish_up);
		$item->setPublishDown($raw_item->publish_down);


		$images = array();
		$links  = array();
		$texts  = array();

		// Get the default images for item and category
		$image_sizes = array('_XS', '_S', '_M', '_L', '_XL', '_Generic');

		foreach ($image_sizes as $image_size) {
			$image_uri = 'media/k2/items/cache/' . md5("Image" . $raw_item->id) . $image_size . '.jpg';
			if (JFile::exists(JPATH_SITE . '/' . $image_uri)) {
				$image = new RokSprocket_Item_Image();
				$image->setSource($image_uri);
				$image->setIdentifier('item_image' . $image_size);
				$image->setCaption('');
				$image->setAlttext('');
				$images[$image->getIdentifier()] = $image;
			}
			if (isset($images['item_image_S'])) {
				$item->setPrimaryImage($images['item_image_S']);
			}
		}
		if (isset($raw_item->category_image) && !empty($raw_item->category_image)) {
			$image = new RokSprocket_Item_Image();
			$image->setSource('media/k2/categories/' . $raw_item->category_image);
			$image->setIdentifier('item_image_category');
			$image->setCaption('');
			$image->setAlttext('');
			$images[$image->getIdentifier()] = $image;
		}

		// Get default Text fields for an item
		$texts['text_introtext'] = $raw_item->introtext;
		$texts['text_fulltext']  = $raw_item->fulltext;
		$texts['text_title']     = $raw_item->title;
		$texts['text_metadesc']  = $raw_item->metadesc;


		// get all extra fields for an item
		$item_extra_field_values = json_decode($raw_item->extra_fields);

		if (!empty($item_extra_field_values)) {
			foreach ($item_extra_field_values as $item_extra_field) {
				$field_info = self::getExtraFieldInfo($item_extra_field->id);
				if ($field_info !== false && isset($item_extra_field->value)) {
					switch ($field_info->type) {
						case 'image':
							$image = new RokSprocket_Item_Image();
							$image->setSource($item_extra_field->value);
							$image->setIdentifier('item_image_' . $field_info->field_name);
							$image->setCaption('');
							$image->setAlttext('');
							$images[$image->getIdentifier()] = $image;
							break;
						case 'link':
							$link = new RokSprocket_Item_Link();
							$link->setUrl($item_extra_field->value[1]);
							$link->setText($item_extra_field->value[0]);
							$link->setIdentifier('item_link_' . $item_extra_field->id);
							$links[$link->getIdentifier()] = $link;
							break;
						case 'textarea':
						case 'textfield':
							$texts['text_' . $item_extra_field->id] = $item_extra_field->value;
							break;
					}
				}
			}
		}

		// set the item fields
		$item->setImages($images);
		$item->setLinks($links);

		$texts = $this->processPlugins($texts);
		$item->setTextFields($texts);
		$item->setText($texts['text_introtext']);

		$item->setDbOrder($dborder);

		require_once(JPATH_SITE . '/components/com_k2/helpers/route.php');
		$primary_link = new RokSprocket_Item_Link();
		$primary_link->setUrl(JRoute::_(K2HelperRoute::getItemRoute($raw_item->id . ':' . $raw_item->alias, $raw_item->catid . ':' . $raw_item->category_alias), true));
		$primary_link->getIdentifier('article_link');
		$item->setPrimaryLink($primary_link);

		// unknown joomla items
		$item->setCommentCount($raw_item->comment_count);
		if (isset($raw_item->tags)) {
			$tags = (explode(',', $raw_item->tags)) ? explode(',', $raw_item->tags) : array();
			$item->setTags($tags);
		}
		return $item;
	}

	/**
	 * @param $id
	 *
	 * @return string
	 */
	protected function getArticleEditUrl($id)
	{
		return JURI::root(true) . '/administrator/index.php?option=com_k2&view=item&cid=' . $id;
	}

	/**
	 * @return array the array of image type and label
	 */
	public static function getImageTypes()
	{
		$list = array();

		if ($fields = self::getFieldTypes("image", false)) {

			if (!empty($fields)) {
				foreach ($fields as $field) {
					$list[$field->id]            = array();
					$list[$field->id]['group']   = $field->group_id;
					$list[$field->id]['display'] = $field->field_name;
				}
			}
		}

		$static = array(
			'item_image_XS'       => array('group' => null, 'display' => 'Extra Small Item Image'),
			'item_image_S'        => array('group' => null, 'display' => 'Small Item Image'),
			'item_image_M'        => array('group' => null, 'display' => 'Medium Item Image'),
			'item_image_L'        => array('group' => null, 'display' => 'Large Item Image'),
			'item_image_XL'       => array('group' => null, 'display' => 'Extra Large Item Image'),
			'item_image_category' => array('group' => null, 'display' => 'Category Image')
		);
		$list   = array_merge($static, $list);
		return $list;
	}

	/**
	 * @return array the array of link types and label
	 */
	public static function getLinkTypes()
	{
		$list = array();

		if ($fields = self::getFieldTypes("link", false)) {

			foreach ($fields as $field) {
				$list[$field->id]            = array();
				$list[$field->id]['group']   = $field->catid;
				$list[$field->id]['display'] = $field->field_name;
			}
		}
		return $list;
	}

	/**
	 * @return array the array of link types and label
	 */
	public static function getTextTypes()
	{
		$list = array();

		if ($fields = self::getFieldTypes(array("textarea", "textfield"), false)) {

			foreach ($fields as $field) {
				$list['text_' . $field->id]            = array();
				$list['text_' . $field->id]['group']   = $field->catid;
				$list['text_' . $field->id]['display'] = ($field->category) ? $field->category . ' - ' : '' . $field->field_name;
			}
		}
		$static = array(
			'text_introtext' => array('group' => null, 'display' => 'Intro Text'),
			'text_title'     => array('group' => null, 'display' => 'Article Title'),
			'text_fulltext'  => array('group' => null, 'display' => 'Full Text'),
			'text_metadesc'  => array('group' => null, 'display' => 'Meta Description Text'),
		);
		$list   = array_merge($static, $list);
		return $list;
	}

	/**
	 * @static
	 * @return array
	 */
	public static function getCCKGroups()
	{
		$populator = new RokSprocket_Provider_K2_CategoryPopulator();
		$options   = $populator->getPicklistOptions();
		return $options;
	}

	public static function getFieldTypes($needed_field_types = false, $id_only = true)
	{
		self::loadExtraFieldTypes();
		if (!is_array($needed_field_types)) {
			$needed_field_types = array($needed_field_types);
		}

		$types = array();
		foreach (self::$extra_fields as $extra_field) {
			foreach ($needed_field_types as $needed_field_type) {
				if (($extra_field->type == $needed_field_type) || ($needed_field_type == 'all')) {
					if ($id_only) {
						$idclass     = new stdClass();
						$idclass->id = $extra_field->id;
						$types[]     = $idclass;
					} else {
						$types[] = $extra_field;
					}
				}
			}
		}
		return $types;
	}

	protected static function getExtraFieldInfo($id)
	{
		self::loadExtraFieldTypes();
		foreach (self::$extra_fields as $extra_field) {
			if ($extra_field->id == $id) {
				return $extra_field;
			}
		}
		return false;
	}

	protected static function loadExtraFieldTypes()
	{
		if (!isset(self::$extra_fields)) {
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true);
			$query->select('f.id, f.type, f.name as field_name, fg.id as group_id, fg.name as group_name, cat.id as catid, cat.name as category');
			$query->from('#__k2_extra_fields AS f');
			$query->join('LEFT', '#__k2_extra_fields_groups AS fg ON fg.id = f.group');
			$query->join('LEFT', '#__k2_categories AS cat ON cat.extraFieldsGroup = fg.id');
			$query->group('f.id');
			$query->order('fg.name, f.name');

			$db->setQuery($query);

			self::$extra_fields = $db->loadObjectList();
			if (self::$extra_fields == null) {
				self::$extra_fields = array();
			}
		}
	}
}

