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

/**
 *
 * @package    PTA
 * @subpackage Storage Pools
 * @category   Models
 * @author     Deon George
 * @copyright  (c) 2010 phpTSMadmin Development Team
 * @license    http://phptsmadmin.sf.net/license.html
 */
class Model_STGPOOL extends ORM_TSM {
	protected $_table_name = 'STGPOOLS';
	protected $_primary_key = 'STGPOOL_NAME';
	protected $_sorting = array(
		'STGPOOL_NAME'=>'ASC',
	);

	protected $_has_one = array(
		'DEVCLASSES'=>array('foreign_key'=>'DEVCLASS_NAME','far_key'=>'DEVCLASS'),
	);
	protected $_has_many = array(
		'COPYGROUP_AR'=>array('foreign_key'=>'DESTINATION','far_key'=>'STGPOOL_NAME'),
		'COPYGROUP_BU'=>array('foreign_key'=>'DESTINATION','far_key'=>'STGPOOL_NAME'),
		'MGMTCLASS'=>array('foreign_key'=>'MIGDESTINATION','far_key'=>'STGPOOL_NAME'),
		'VOLUME'=>array('foreign_key'=>'STGPOOL_NAME','far_key'=>'STGPOOL_NAME'),
		'OCC'=>array('foreign_key'=>'STGPOOL_NAME','far_key'=>'STGPOOL_NAME'),
	);

	/**
	 * Get all the OCCUPANCY for this STORAGE POOL
	 */
	private function _occupancy() {
		$result = array();

		// In the interest of performance, we load all the records and get PHP to process it.
		// Our ORM caching we reduce the hit on TSM.
		foreach (ORM::factory('OCC')->find_all() as $o)
			if ($o->STGPOOL_NAME == $this->STGPOOL_NAME)
				array_push($result,$o);

		return $result;
	}

	/**
	 * Get all the NODES for this STORAGE POOL
	 */
	public function nodes() {
		$k = sprintf('%s-%s',__METHOD__,$this->STGPOOL_NAME);
		$c = Kohana::$config->load('config')->cache;

		if (is_null($result = Cache::instance($c)->get($k))) {
			$result = array();

			// @todo This might want to return the NODE object.
			foreach ($this->_occupancy() as $oo)
				if (! in_array($oo->NODE_NAME,$result))
					array_push($result,$oo->NODE_NAME);

			// @todo Cache time should be configurble
			Cache::instance($c)->set($k,$result,300);
		}

		return $result;
	}

        // Return a list of volumes
        // @param $inout IN|OUT of the library
        // @param $status volume status FULL|FILLING|PENDING|EMPTY
	public function libvolstype($inout,$status) {
		$inout = strtolower($inout);
		$status = strtoupper($status);
		$result = array();

		if (! isset($result[$inout]))
			foreach ($this->VOLUME->find_all() as $vo) {
				$state = $vo->MEDIA->inlib() ? 'in' : 'out';

				$result[$state][$vo->STATUS][] = $vo;
			}

		return isset($result[$inout][$status]) ? $result[$inout][$status] : array();
	}
}
?>
