<?php
 
class Utils_ZFApplicationExplorer
{
 
    /**
    * Explore les modules du MVC à la recherche de tous les controllers et leurs actions
    * et retourne toutes ces infos dans un tableau:
    *	$modulesInfo['modules'][$modName]['controllers'][$ctrlName]['actions'][] = $actionName ;
    * @return array Un tableau avec les modules, leurs controllers et leurs actions.
    */
    public static function exploreControllers()
    {
 
    	$zcf = Zend_Controller_Front::getInstance();
    	//Zend_Debug::dump($zcf, 'FrontController:');
 
    	$defaultModuleName = $zcf->getDefaultModule();
 
		$modulesInfo = array(
			'defaultModuleName' => $defaultModuleName ,
			'defaultControllerName' => $zcf->getDefaultControllerName(),
			'defaultAction' => $zcf->getDefaultAction(),
			'modules'=>array()
		);
 
    	$dirs = $zcf->getControllerDirectory();
    	//Zend_Debug::dump($dirs, 'Folders des controllers:');
 
    	$matches = null ;
    	foreach( $dirs as $modName => $modControllersPath )
    	{
    		$modName = strtolower($modName);
    		$modulesInfo['modules'][$modName] = array(
    			'controllersPath' => $modControllersPath,
    			'controllers' => array()
    		);
 
		    if( ! ($dh = opendir($modControllersPath)) )
		    {
		    	continue ;
		    }
 
		    while( ($file = readdir($dh)) !== false )
	        {
	        	if( ! preg_match('/(.*)Controller.php$/', $file, $matches ) )
	        	{
	        		continue ;
	        	}
 
	        	$ctrlName = strtolower($matches[1]);
	        	$ctrlClassName = $ctrlName .'Controller' ;
            	$filePath = $modControllersPath.DIRECTORY_SEPARATOR.$file ;
 
            	// Si ce n'est pas le module par défaut,
            	// le nom de la classe doit être préfixé par le nom du module.
            	if( $modName != $defaultModuleName )
            	{
            		$ctrlClassName = $modName.'_'.$ctrlClassName ;
            	}
 
            	$modulesInfo['modules'][$modName]['controllers'][$ctrlName] = array(
					'controllerClass' => $ctrlClassName,
					'actions' => array()
				);
 
            	require_once($filePath);
				if( ! class_exists($ctrlClassName) )
            	{
	            	$fileReflect = new Zend_Reflection_File($filePath);
	            	// Ici il peut y avoir un problème de nom de classe
	            	// causé par un problème de casse de caractère.
	            	$class = $fileReflect->getClass($ctrlClassName);
            	}
            	else
            	{
            		$class = new Zend_Reflection_Class( $ctrlClassName );
            	}
            	$methods = $class->getMethods();
				//Zend_Debug::dump($methods);
				foreach( $methods as $k => $methodInfo )
				{
					if( ! preg_match('/(.*)Action$/',$methodInfo->name,$matches) )
					{
						continue ;
					}
					$actionName = strtolower($matches[1]);
 
					// on
					$r = new Zend_Reflection_Method($ctrlClassName, $methodInfo->name);
 
					try {
						$docblock = $r->getDocblock();
						$shortDescription = $docblock->getShortDescription();
						$longDescription = $docblock->getLongDescription();
					} catch (Exception $e) {
						$longDescription = $shortDescription = '';
					}
 
					$modulesInfo['modules'][$modName]['controllers'][$ctrlName]['actions'][$actionName] = array(
						'action' => $actionName,
						'pageId' => $modName.'/'.$ctrlName.'/'.$actionName,
						'shortDescription' => $shortDescription,
						'longDescription' => $longDescription
					);
					 ;
				}
	        }
	        closedir($dh);
 
    	}
 
    	return $modulesInfo ;
    }
 
}