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

/**
 * This class supports SSL
 *
 * @package    SSL
 * @category   Models
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Model_SSL_CA extends ORM_OSB {
	protected $_updated_column = FALSE;

	// Relationships
	protected $_has_many = array(
		'service'=>array('through'=>'service__ssl'),
	);

	protected $_display_filters = array(
		'sign_cert'=>array(
			array('SSL::subject',array(':value')),
		),
	);

	public function rules() {
		return array(
			'sign_cert'=>array(
				array(array($this,'isCert')),
				array(array($this,'isCA')),
			),
			'parent_ssl_ca_id'=>array(
				array(array($this,'Rule_ParentExists')),
			),
		);
	}

	public function filters() {
		return array(
			'parent_ssl_ca_id'=>array(
				array(array($this,'Filter_GetParent')),
			)
		);
	}

	private $_so = NULL;

	/**
	 * Resolve any queries to certificate details
	 */
	public function __call($name,$args) {
		$m = 'get_'.$name;

		if (method_exists($this->_so,$m))
			return $this->_so->{$m}($args);
		else
			throw new Kohana_Exception('Unknown method :method',array(':method'=>$name));
	}

	// We want to inject the SSL object into this Model
	protected function _load_values(array $values) {
		parent::_load_values($values);

		if ($this->sign_cert)
			$this->_so = SSL::instance($this->sign_cert);

		return $this;
	}

	// If we change the SSL certificate, we need to reload our SSL object
	public function values(array $values, array $expected = NULL) {
		parent::values($values,$expected);

		if (array_key_exists('sign_cert',$values))
			$this->_so = SSL::instance($this->sign_cert);

		return $this;
	}

	// @todo This could require some optimisation, by storing the keyid in the database and then getting the DB just to return that parent
	public function Filter_GetParent() {
		foreach (ORM::factory($this->_object_name)->find_all() as $sco)
			if ($sco->aki_keyid() == $this->aki_keyid())
				return $sco->id;
	}

	public function Rule_ParentExists() {
		// Our parent_ssl_ca_id should have been populated by Filter_GetParent().
		return $this->parent_ssl_ca_id OR $this->isRoot();
	}

	public function list_issued() {
		return $this->service->find_all();
	}
}
?>