<?php namespace Majestic\App;
/**
 * @copyright NetMonsters <team@netmonsters.ru>
 * @link http://netmonsters.ru
 * @package Majestic
 * @subpackage app
 * @since 2010-02-25
 */

class ErrorAction extends Action
{

    /**
     * @var \ErrorException|\Majestic\Exception\ErrorHTTPException
     */
    public $exception;

    protected $ajax_error = false;

    public function __construct($exception)
    {
        $this->exception = $exception;
        parent::__construct();
    }

    protected function execute()
    {
        if ($this->exception instanceof \Majestic\Exception\Error404Exception) {
            $this->template = 404;
        } elseif ($this->exception instanceof \Majestic\Exception\ErrorHTTPException) {
            $this->template = 'HTTP';
        } else {
            $this->template = 500;
        }
        $this->logError();
        $this->sendHTTPCode();
    }

    public function fetch()
    {
        if ($this->isAjaxActionError()) {
            return $this->exception->getMessage();
        }
        return parent::fetch();
    }

    protected function getTemplate()
    {
        return '/actions/' . $this->template;
    }

    protected function sendHttpCode()
    {
        if ($this->exception instanceof \Majestic\Exception\ErrorHTTPException) {
            header($this->exception->getHTTPHeader());
        } else {
            header('HTTP/1.0 500 Internal Server Error');
        }
    }

    protected function logError()
    {
        if (!$this->exception instanceof \Majestic\Exception\Error404Exception) {
	        \Majestic\Exception\ErrorHandler::logError($this->exception);
        }
    }

    /**
     * Check, if exception was thrown from AjaxAction Class
     * @return bool
     */
    protected function isAjaxActionError()
    {
        return $this->ajax_error;
    }

    /**
     * Set if exception was thrown from AjaxAction subclass
     */
    public function setAjaxError()
    {
        $this->ajax_error = true;
    }
}