<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Zend\Mvc\Controller;

use 
Zend\Http\Response as HttpResponse;
use 
Zend\Mvc\Exception;
use 
Zend\Mvc\MvcEvent;
use 
Zend\View\Model\ConsoleModel;
use 
Zend\View\Model\ViewModel;

/**
 * Basic action controller
 */
abstract class AbstractActionController extends AbstractController
{
    
/**
     * @var string
     */
    
protected $eventIdentifier __CLASS__;

    
/**
     * Default action if none provided
     *
     * @return array
     */
    
public function indexAction()
    {
        return new 
ViewModel(array(
            
'content' => 'Placeholder page'
        
));
    }

    
/**
     * Action called if matched action does not exist
     *
     * @return array
     */
    
public function notFoundAction()
    {
        
$response   $this->response;
        
$event      $this->getEvent();
        
$routeMatch $event->getRouteMatch();
        
$routeMatch->setParam('action''not-found');

        if (
$response instanceof HttpResponse) {
            return 
$this->createHttpNotFoundModel($response);
        }
        return 
$this->createConsoleNotFoundModel($response);
    }

    
/**
     * Execute the request
     *
     * @param  MvcEvent $e
     * @return mixed
     * @throws Exception\DomainException
     */
    
public function onDispatch(MvcEvent $e)
    {
        
$routeMatch $e->getRouteMatch();
        if (!
$routeMatch) {
            
/**
             * @todo Determine requirements for when route match is missing.
             *       Potentially allow pulling directly from request metadata?
             */
            
throw new Exception\DomainException('Missing route matches; unsure how to retrieve action');
        }

        
$action $routeMatch->getParam('action''not-found');
        
$method = static::getMethodFromAction($action);

        if (!
method_exists($this$method)) {
            
$method 'notFoundAction';
        }

        
$actionResponse $this->$method();

        
$e->setResult($actionResponse);

        return 
$actionResponse;
    }

    
/**
     * Create an HTTP view model representing a "not found" page
     *
     * @param  HttpResponse $response
     * @return ViewModel
     */
    
protected function createHttpNotFoundModel(HttpResponse $response)
    {
        
$response->setStatusCode(404);
        return new 
ViewModel(array(
            
'content' => 'Page not found',
        ));
    }

    
/**
     * Create a console view model representing a "not found" action
     *
     * @param  \Zend\Stdlib\ResponseInterface $response
     * @return ConsoleModel
     */
    
protected function createConsoleNotFoundModel($response)
    {
        
$viewModel = new ConsoleModel();
        
$viewModel->setErrorLevel(1);
        
$viewModel->setResult('Page not found');
        return 
$viewModel;
    }
}