<?php defined('SYSPATH') or die('No direct access allowed.');

/**
 * This class supports OSB listing products by category.
 *
 * @package    Product
 * @category   Models
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Model_Product_Category extends ORM_OSB {
	protected $_table_name = 'product_cat';
	protected $_created_column = FALSE;
	protected $_updated_column = FALSE;

	protected $_nullifempty = array(
		'status',
		'template',
	);

	protected $_has_many = array(
		'subcategories'=>array('model'=>'product_category','foreign_key'=>'parent_id','far_key'=>'id'),
		'translate'=>array('model'=>'Product_Category_Translate','foreign_key'=>'product_cat_id','far_key'=>'id'),
	);

	protected $_sorting = array(
		'position'=>'ASC',
	);

	protected $_save_message = TRUE;

	/**
	 * Return the translated description for a category.
	 */
	public function description() {
		$x = $this->translate();

		return $x->loaded() ? $x->display('description') : 'No Description';
	}

	/**
	 * List all the products belonging to this cateogry
	 */
	public function products() {
		$result = array();

		foreach (ORM::factory('Product')->where_active()->find_all() as $po)
			if (in_array($this->id,$po->avail_category))
				array_push($result,$po);

		return $result;
	}

	public function save(Validation $validation=NULL) {
		parent::save($validation);

		// Save our Translated Message
		if ($x = array_diff_key($_POST,$this->_object) AND ! empty($_POST['language_id']) AND ! empty($_POST['translate']) AND is_array($_POST['translate'])) {
			$to = $this->translate->where('language_id','=',$_POST['language_id'])->find();

			// For a new entry, we need to set the product_cat_id
			if (! $to->loaded()) {
				$to->product_cat_id = $this->id;
				$to->language_id = $_POST['language_id'];
			}

			$to->values($x['translate'])->save();
		}

		return $this;
	}

	/**
	 * Return the template that is used to render the product category
	 */
	public function template() {
		if (! $this->template)
			throw new Kohana_Exception('Product category :category doesnt have a template',array(':category'=>$this->id));

		$o = Kohana::classname('Product_Category_Template_'.$this->template);

		return new $o($this);
	}

	public function templates() {
		$template_path = 'classes/Product/Category/Template';
		$result = array('');

		foreach (Kohana::list_files($template_path) as $file => $path) {
			$file = strtoupper(preg_replace('/.php$/','',str_replace($template_path.'/','',$file)));
			$result[$file] = $file;
		}

		return $result;
	}

	/**
	 * Return the translated title for a category
	 */
	public function title() {
		$x = $this->translate();

		return $x->loaded() ? $x->display('name') : 'No Title';
	}


	private function translate() {
		return $this->translate->where('language_id','=',Config::language())->find();
	}
}
?>
