<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use yii\console\Controller;
use yii\helpers\FileHelper;

/**
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
class ClassmapController extends Controller
{
	public $defaultAction = 'create';

	/**
	 * Creates a class map for the core Yii classes.
	 * @param string $root the root path of Yii framework. Defaults to YII_PATH.
	 * @param string $mapFile the file to contain the class map. Defaults to YII_PATH . '/classes.php'.
	 */
	public function actionCreate($root = null, $mapFile = null)
	{
		if ($root === null) {
			$root = YII_PATH;
		}
		$root = FileHelper::normalizePath($root);
		if ($mapFile === null) {
			$mapFile = YII_PATH . '/classes.php';
		}
		$options = [
			'filter' => function ($path) {
				if (is_file($path)) {
					$file = basename($path);
					if ($file[0] < 'A' || $file[0] > 'Z') {
						return false;
					}
				}
				return null;
			},
			'only' => ['.php'],
			'except' => [
				'Yii.php',
				'BaseYii.php',
				'/debug/',
				'/console/',
				'/test/',
				'/gii/',
			],
		];
		$files = FileHelper::findFiles($root, $options);
		$map = [];
		foreach ($files as $file) {
			if (($pos = strpos($file, $root)) !== 0) {
				die("Something wrong: $file\n");
			}
			$path = str_replace('\\', '/', substr($file, strlen($root)));
			$map[$path] = "\t'yii" . substr(str_replace('/', '\\', $path), 0, -4) . "' => YII_PATH . '$path',";
		}
		ksort($map);
		$map = implode("\n", $map);
		$output = <<<EOD
<?php
/**
 * Yii core class map.
 *
 * This file is automatically generated by the "build classmap" command under the "build" folder.
 * Do not modify it directly.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

return [
$map
];

EOD;
		if (is_file($mapFile) && file_get_contents($mapFile) === $output) {
			echo "Nothing changed.\n";
		} else {
			file_put_contents($mapFile, $output);
			echo "Class map saved in $mapFile\n";
		}
	}
}
