<?php

/**
 * HttpProxyController
 *
 * @author Erik Amaru Ortiz <erik@colosa.com, aortiz.erik@gmail.com>
 * @package gulliver.system
 * @access private
 */
class HttpProxyController
{

    /**
     *
     * @var array - private array to store proxy data
     */
    private $__data__ = array();

    /**
     *
     * @var object - private object to store the http request data
     */
    private $__request__;

    public $jsonResponse = true;

    private $sendResponse = true;

    public function __construct()
    {
        $this->__request__ = new stdclass();
    }

    /**
     * Magic setter method
     *
     * @param string $name
     * @param string $value
     */
    public function __set($name, $value)
    {
        //echo "Setting '$name' to '$value'\n";
        $this->__data__[$name] = $value;
    }

    /**
     * Magic getter method
     *
     * @param string $name
     * @return string or NULL if the internal var doesn't exist
     */
    public function __get($name)
    {
        //echo "Getting '$name'\n";
        if (array_key_exists($name, $this->__data__)) {
            return $this->__data__[$name];
        }

        /*$trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;*/
    }

    /**
     * Magic isset method
     *
     * @param string $name
     */
    public function __isset($name)
    {
        //echo "Is '$name' set?\n";
        return isset($this->__data__[$name]);
    }

    /**
     * Magic unset method
     *
     * @param string $name
     */
    public function __unset($name)
    {
        //echo "Unsetting '$name'\n";
        unset($this->__data__[$name]);
    }

    /**
     * call to execute a internal proxy method and handle its exceptions
     *
     * @param string $name
     */
    public function call($name)
    {
        $result = new stdClass();
        try {
            $result = $this->$name($this->__request__);

            if (! $this->jsonResponse) {
                return null;
            }

            if (! $result) {
                $result = $this->__data__;
            }
        } catch (Exception $e) {
            $result->success = false;
            $result->message = $result->msg = $e->getMessage();
            switch (get_class($e)) {
                case 'Exception':
                    $error = "SYSTEM ERROR";
                    break;
                case 'PMException':
                    $error = "PROCESSMAKER ERROR";
                    break;
                case 'PropelException':
                    $error = "DATABASE ERROR";
                    break;
                case 'UserException':
                    $error = "USER ERROR";
                    break;
            }
            $result->error = $e->getMessage();
            $result->exception = new stdClass();
            $result->exception->class = get_class($e);
            $result->exception->code = $e->getCode();
            $result->exception->trace = $e->getTraceAsString();
        }

        if ($this->sendResponse) {
            print G::json_encode($result);
        }
    }

    /**
     * Set the http request data
     *
     * @param array $data
     */
    public function setHttpRequestData($data)
    {
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                $this->__request__->{$key} = $value;
            }
        } else {
            $this->__request__ = $data;
        }
    }

    public function setJsonResponse($bool)
    {
        $this->jsonResponse = $bool;
    }

    /**
     * Send response to client
     *
     * @param boolean $val
     */
    public function setSendResponse($val)
    {
        $this->sendResponse = $val;
    }
}
