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

/**
 * This class provides MODULE management
 *
 * @package    OSB
 * @category   Controllers/Admin
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Controller_Admin_Module_Method extends Controller_Admin_Module {
	/**
	 * Add a method to the database
	 */
	public function action_add() {
		$id = $this->request->param('id');
		$method = $this->request->param('sid');

		$mo = ORM::factory('Module',$id);
		$mmo = ORM::factory('Module_Method');

		if (! $mo->loaded() OR ! in_array($method,$this->_methods($mo->name)))
			throw new Kohana_Exception('Method (:method) does not exist in :class',array(':method'=>$method,':class'=>$mo->name));

		$mmo->name = $method;
		$mmo->module_id = $mo->id;
		$mmo->values($_POST);

		$output = '';

		if ($_POST AND $mmo->values($_POST)->check()) {
			$mmo->save();

			if ($mmo->saved()) {
				SystemMessage::add(array(
					'title'=>_('Method Added'),
					'type'=>'info',
					'body'=>sprintf(_('Method %s defined to database'),$mmo->name),
				));

				HTTP::redirect(URL::link('admin','/module/edit/'.$mo->id));

			} else {
				SystemMessage::add(array(
					'title'=>_('Method Not Saved'),
					'type'=>'error',
					'body'=>sprintf(_('Unable to define Method %s to database?'),$mmo->name),
				));
			}
		}

		$output .= View::factory('module/admin/method_add')
			->set('module',$mo)
			->set('method',$mmo);

		Block::add(array(
			'title'=>sprintf(_('Add Method (%s) to Database for (%s)'),strtoupper($mmo->name),strtoupper($mo->name)),
			'body'=>$output,
		));
	}

	/**
	 * Edit a Module Configuration
	 *
	 * @param int $mid Module ID
	 */
	public function action_edit() {
		$mid = $this->request->param('id');
		$mmo = ORM::factory('Module_Method',$mid);

		if (! $mmo->loaded()) {
			SystemMessage::add(array(
				'title'=>_('Invalid Method ID'),
				'type'=>'error',
				'body'=>sprintf(_('Method with ID %s doesnt appear to exist?'),$mid),
			));

			return;
		}

		$output = '';

		// The groups that can run this method.
		$groups = ORM::factory('Group');

		if ($_POST) {
			foreach ($groups->find_all() as $go) {
				// If the group was defined and no longer
				if ($mmo->has('group',$go) AND (! isset($_POST['groups']) OR ! in_array($go->id,$_POST['groups']))) {
					$gm = ORM::factory('Group_Method',array('method_id'=>$mmo->id,'group_id'=>$go->id));

					if (! $gm->delete())
						SystemMessage::add(array(
							'title'=>_('Unable to DELETE Group Method'),
							'type'=>'error',
							'body'=>sprintf(_('Unable to delete Group Method for method %s and group %s'),$mmo->name,$go->name),
						));

				// If the group was not defined and now is
				} elseif (! $mmo->has('group',$go) AND isset($_POST['groups']) AND in_array($go->id,$_POST['groups'])) {
					$gm = ORM::factory('Group_Method')
						->values(array(
							'method_id'=>$mmo->id,
							'group_id'=>$go->id,
						));

					if (! $gm->check() OR ! $gm->save())
						SystemMessage::add(array(
							'title'=>_('Unable to SAVE Group Method'),
							'type'=>'error',
							'body'=>sprintf(_('Unable to save Group Method for method %s and group %s'),$mmo->name,$go->name),
						));
				}
			}
		}

		$output .= Form::open();

		$output .= View::factory('module/admin/method_detail_head');
		foreach ($groups->find_all() as $go) {
			$output .= View::factory('module/admin/method_detail_body')
				->set('group',$go)
				->set('defined',$mmo->has('group',$go));
		}
		$output .= View::factory('module/admin/method_detail_foot');

		$output .= '<div>'.Form::submit('submit',_('Update'),array('class'=>'form_button')).'</div>';
		$output .= Form::close();

		Block::add(array(
			'title'=>sprintf(_('%s->%s Method'),strtoupper($mmo->module->name),strtoupper($mmo->name)),
			'body'=>$output,
		));
	}
}
?>