<?php
/**
 * @copyright NetMonsters <team@netmonsters.ru>
 * @link http://netmonsters.ru
 * @package Majestic
 * @subpackage app
 * @since 2010-02-25
 * @version SVN: $Id$
 * @filesource $URL$
 */

class ErrorAction extends Action
{

    /**
     * @var ErrorException
     */
    public $exception;

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

    protected function execute()
    {
        $this->template = 500;
        if ($this->exception instanceof Error404Exception) {
            if ($this->isAjaxActionError()) {
                if (!headers_sent()) {
                    header('HTTP/1.0 404 Not Found');
                    die();
                }
            }
            $this->template = 404;
        }
        $this->logError();
        $this->sendHTTPCode();
    }

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

    protected function sendHttpCode()
    {
        if (headers_sent()) {
            return;
        }
        switch ($this->template) {
            case 404:
                header('HTTP/1.0 404 Not Found');
            break;
            default:
                header('HTTP/1.0 500 Internal Server Error');
        }
    }
    
    protected function logError()
    {
        if ($this->template == 500) {
            
            $error = 0;
            $ex = $this->exception;
            if ($ex instanceof ErrorException) {
                $error = $ex->getSeverity();
            }

            switch ($error) {
                case E_NOTICE:
                    $error = 'Notice';
                    break;
                case E_WARNING:
                    $error = 'Warning';
                    break;
                case E_ERROR:
                    $error = 'Fatal Error';
                    break;
                default:
                    $error = 'Unknown Error';
                    break;
            }
            $message = 'PHP ' . $error . ':  ' . $ex->getMessage() . ' in ' . $ex->getFile()
                       . ' on line ' . $ex->getLine();
            error_log($message);
        }
    }

    /**
     * Check, if exception was thrown from AjaxAction Class
     * @return bool
     */
    protected function isAjaxActionError()
    {
        $trace = $this->exception->getTrace();
        foreach ($trace as $line) {
            if (isset($line['class']) && $line['class'] === 'AjaxAction') {
                return true;
            }
        }
        return false;
    }
}