<?php
/**
 * @package framework
 * @subpackage tasks
 */
class i18nTextCollectorTask extends BuildTask {

	protected $title = "i18n Textcollector Task";

	protected $description = "
		Traverses through files in order to collect the 'entity master tables'
		stored in each module.

		Parameters:
		- locale: Sets default locale
		- writer: Custom writer class (defaults to i18nTextCollector_Writer_RailsYaml)
		- module: One or more modules to limit collection (comma-separated)
		- merge: Merge new strings with existing ones already defined in language files (default: FALSE)
	";

	public function init() {
		parent::init();

		$canAccess = (Director::isDev() || Director::is_cli() || Permission::check("ADMIN"));
		if(!$canAccess) {
			return Security::permissionFailure($this);
		}
	}

	/**
	 * This is the main method to build the master string tables with the original strings.
	 * It will search for existent modules that use the i18n feature, parse the _t() calls
	 * and write the resultant files in the lang folder of each module.
	 *
	 * @uses DataObject->collectI18nStatics()
	 *
	 * @param SS_HTTPRequest $request
	 */
	public function run($request) {
		increase_time_limit_to();
		$collector = i18nTextCollector::create($request->getVar('locale'));

		$merge = $this->getIsMerge($request);

		// Custom writer
		$writerName = $request->getVar('writer');
		if($writerName) {
			$writer = Injector::inst()->get($writerName);
			$collector->setWriter($writer);
		}

		// Get restrictions
		$restrictModules = ($request->getVar('module'))
			? explode(',', $request->getVar('module'))
			: null;

		$collector->run($restrictModules, $merge);

		Debug::message(__CLASS__ . " completed!", false);
	}

	/**
	 * Check if we should merge
	 *
	 * @param SS_HTTPRequest $request
	 */
	protected function getIsMerge($request) {
		$merge = $request->getVar('merge');

		// Default to false if not given
		if(!isset($merge)) {
			Deprecation::notice(
				"4.0",
				"merge will be enabled by default in 4.0. Please use merge=false if you do not want to merge."
			);
			return false;
		}

		// merge=0 or merge=false will disable merge
		return !in_array($merge, array('0', 'false'));
	}
}