<?php defined('SYSPATH') OR die('No direct access');
/**
 * Kohana exception class. Translates exceptions using the [I18n] class.
 *
 * @package    OSB
 * @category   Modifications
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Kohana_Exception extends Kohana_Kohana_Exception {
	/**
	 * Logs an exception in the database. If that fails fall back to Kohana's Logging.
	 *
	 * @uses    Kohana_Exception::text
	 * @param   Exception  $e
	 * @param   int        $level
	 * @return  void
	 */
	public static function log(Exception $e,$level=Log::EMERGENCY) {
		try {
			$eo = ORM::factory('Log_Error');
			$eo->message = Kohana_Exception::text($e);
			$eo->account_id = (PHP_SAPI === 'cli' OR ! Auth::instance()->logged_in()) ? NULL : Auth::instance()->get_user()->id;

			if (Request::current()) {
				$eo->module = (Request::current()->directory() ? Request::current()->directory().'_' : '').Request::current()->controller();
				$eo->method = Request::current()->action();
			}

			$eo->save();

		} catch (Exception $x) {
			return parent::log($e,$level);
		}
	}

	/**
	 * Redirect errors to the main page after showing a system message.
	 * The error should be logged in the DB.
	 *
	 * @param   Exception  $e
	 * @return  Response
	 */
	public static function response(Exception $e) {
		try {
			if (Kohana::$config->load('debug')->show_errors) {
				return parent::response($e);

			} else {
				SystemMessage::add(array(
					'title'=>'An Error Occured.',
					'type'=>'error',
					'body'=>'Dont panic, its been logged.',
				));
			
				// We'll redirect to the main page.
				$response = Response::factory();
				$response->status(302);
				$response->headers('Location',URL::site());

				return $response;
			}

		} catch (Exception $x) {
			return parent::response($e);
		}
	}
}
?>
