<?php

namespace SilverStripe\Control;

use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;

/**
 * Base class invoked from CLI rather than the webserver (Cron jobs, handling email bounces).
 * You can call subclasses of CliController directly, which will trigger a
 * call to {@link process()} on every sub-subclass. For instance, calling
 * "sake DailyTask" from the commandline will call {@link process()} on every subclass
 * of DailyTask.
 */
abstract class CliController extends Controller {

	private static $allowed_actions = array(
		'index'
	);

	protected function init() {
		parent::init();
		// Unless called from the command line, all CliControllers need ADMIN privileges
		if(!Director::is_cli() && !Permission::check("ADMIN")) {
			Security::permissionFailure();
		}
	}

	public function index() {
		foreach(ClassInfo::subclassesFor($this->class) as $subclass) {
			echo $subclass . "\n";
			/** @var CliController $task */
			$task = Injector::inst()->create($subclass);
			$task->doInit();
			$task->process();
		}
	}

	/**
	 * Overload this method to contain the task logic.
	 */
	public function process() {}

}