<?php


/**
 * Class Rest_RouteController
 *
 * Taken from https://github.com/aporat/Application_Rest_Controller_Route
 * to enable hierarchy routing
 */

class Rest_RouteController extends Zend_Controller_Router_Route
{

    /**
     * @var Zend_Controller_Front
     */
    protected $_front;

    protected $_actionKey     = 'action';

    /**
     * Prepares the route for mapping by splitting (exploding) it
     * to a corresponding atomic parts. These parts are assigned
     * a position which is later used for matching and preparing values.
     *
     * @param Zend_Controller_Front $front Front Controller object
     * @param string $route Map used to match with later submitted URL path
     * @param array $defaults Defaults for map variables with keys as variable names
     * @param array $reqs Regular expression requirements for variables (keys as variable names)
     * @param Zend_Translate $translator Translator to use for this instance
     */
    public function __construct(Zend_Controller_Front $front, $route, $defaults = array(), $reqs = array(), Zend_Translate $translator = null, $locale = null)
    {
        $this->_front      = $front;
        $this->_dispatcher = $front->getDispatcher();

        parent::__construct($route, $defaults, $reqs, $translator, $locale);
    }



    /**
     * Matches a user submitted path with parts defined by a map. Assigns and
     * returns an array of variables on a successful match.
     *
     * @param string $path Path used to match against this routing map
     * @return array|false An array of assigned values or a false on a mismatch
     */
    public function match($path, $partial = false)
    {


        $return = parent::match($path, $partial);

        // add the RESTful action mapping
        if ($return) {
            $request = $this->_front->getRequest();
            $path   = $request->getPathInfo();
            $params = $request->getParams();

            $path   = trim($path, self::URI_DELIMITER);

            if ($path != '') {
                $path = explode(self::URI_DELIMITER, $path);
            }

            //Store path count for method mapping
            $pathElementCount = count($path);

            // Determine Action
            $requestMethod = strtolower($request->getMethod());
            if ($requestMethod != 'get') {
                if ($request->getParam('_method')) {
                    $return[$this->_actionKey] = strtolower($request->getParam('_method'));
                } elseif ( $request->getHeader('X-HTTP-Method-Override') ) {
                    $return[$this->_actionKey] = strtolower($request->getHeader('X-HTTP-Method-Override'));
                } else {
                    $return[$this->_actionKey] = $requestMethod;
                }

                // Map PUT and POST to actual create/update actions
                // based on parameter count (posting to resource or collection)
                switch( $return[$this->_actionKey] ){
                    case 'post':
                        $return[$this->_actionKey] = 'post';
                        break;
                    case 'put':
                        $return[$this->_actionKey] = 'put';
                        break;
                }

            } else {
                // if the last argument in the path is a numeric value, consider this request a GET of an item
                $lastParam = array_pop($path);
                if (is_numeric($lastParam)) {
                    $return[$this->_actionKey] = 'get';
                } else {
                    $return[$this->_actionKey] = 'index';
                }
            }

        }

        return $return;

    }

}