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

namespace yii\console\controllers;

use Yii;
use yii\console\Controller;
use yii\console\Exception;
use yii\caching\Cache;

/**
 * This command allows you to flush cache.
 *
 * @author Alexander Makarov <sam@rmcreative.ru>
 * @since 2.0
 */
class CacheController extends Controller
{
	/**
	 * Lists the caches that can be flushed.
	 */
	public function actionIndex()
	{
		$caches = [];
		$components = Yii::$app->getComponents();
		foreach ($components as $name => $component) {
			if ($component instanceof Cache) {
				$caches[$name] = get_class($component);
			} elseif (is_array($component) && isset($component['class']) && strpos($component['class'], 'Cache') !== false) {
				$caches[$name] = $component['class'];
			}
		}
		if (!empty($caches)) {
			echo "The following caches can be flushed:\n\n";
			foreach ($caches as $name => $class) {
				echo " * $name: $class\n";
			}
		} else {
			echo "No cache is used.\n";
		}
	}

	/**
	 * Flushes cache.
	 * @param string $component Name of the cache application component to use.
	 *
	 * @throws \yii\console\Exception
	 */
	public function actionFlush($component = 'cache')
	{
		/** @var Cache $cache */
		$cache = Yii::$app->getComponent($component);
		if (!$cache || !$cache instanceof Cache) {
			throw new Exception('Application component "'.$component.'" is not defined or not a cache.');
		}

		if (!$cache->flush()) {
			throw new Exception('Unable to flush cache.');
		}

		echo "\nDone.\n";
	}
}
