<?php

class W3_ModuleStatus {

    private $_opcode_engines = array(
                                    'apc',
    		                        'opcache',
                                    'eaccelerator',
                                    'xcache',
                                    'wincache'
                                    );
    private $_file_engines = array(
                                    'file',
                                    'file_generic'
                                    );
    /**
     * @var W3_Config
     */
    private $_config;
    public function __construct() {
        $this->_config = w3_instance('W3_Config');
    }

    /**
     * @return bool
     */
    public function plugin_is_enabled() {
        return $this->is_enabled('pgcache')
               || $this->is_enabled('minify')
               || $this->is_enabled('dbcache')
               || $this->is_enabled('objectcache')
               || $this->is_enabled('browsercache')
               || $this->is_enabled('cdn')
               || $this->is_enabled('varnish')
               || $this->is_enabled('newrelic')
               || $this->is_enabled('fragmentcache');
    }

    /**
     * @param $module
     * @return bool
     */
    public function is_enabled($module) {
        return $this->_config->get_boolean("$module.enabled");
    }

    /**
     * Verifies that the module is actually running and not only enabled.
     * @param $module
     * @return mixed|void
     */
    public function is_running($module) {
        return apply_filters("w3tc_module_is_running-{$module}", $this->is_enabled($module));
    }

    /**
     * @return bool
     */
    public function all_modules_enabled() {
        return $this->is_enabled('pgcache')
            && $this->is_enabled('minify')
            && $this->is_enabled('dbcache')
            && $this->is_enabled('objectcache')
            && $this->is_enabled('browsercache')
            && $this->is_enabled('cdn')
            && $this->is_enabled('varnish')
            && $this->is_enabled('fragmentcache');
    }

    /**
     * @return bool
     */
    public function can_empty_memcache() {
        return $this->_enabled_module_uses_engine('pgcache', 'memcached')
                || $this->_enabled_module_uses_engine('dbcache', 'memcached')
                || $this->_enabled_module_uses_engine('objectcache', 'memcached')
                || $this->_enabled_module_uses_engine('minify', 'memcached')
                || $this->_enabled_module_uses_engine('fragmentcache', 'memcached');
    }

    /**
     * @return bool
     */
    public function can_empty_redis() {
        return $this->_enabled_module_uses_engine('pgcache', 'redis')
                || $this->_enabled_module_uses_engine('dbcache', 'redis')
                || $this->_enabled_module_uses_engine('objectcache', 'redis')
                || $this->_enabled_module_uses_engine('minify', 'redis')
                || $this->_enabled_module_uses_engine('fragmentcache', 'redis');
    }
    
    /**
     * @return bool
     */
    public function can_empty_apcu() {
    	return $this->_enabled_module_uses_engine('pgcache', 'apcu')
		    	|| $this->_enabled_module_uses_engine('dbcache', 'apcu')
		    	|| $this->_enabled_module_uses_engine('objectcache', 'apcu')
		    	|| $this->_enabled_module_uses_engine('minify', 'apcu')
		    	|| $this->_enabled_module_uses_engine('fragmentcache', 'apcu');
    }

    /**
     * @return bool
     */
    public function can_empty_opcode() {
        return $this->_enabled_module_uses_engine('pgcache', $this->_opcode_engines)
                || $this->_enabled_module_uses_engine('dbcache', $this->_opcode_engines)
                || $this->_enabled_module_uses_engine('objectcache', $this->_opcode_engines)
                || $this->_enabled_module_uses_engine('minify', $this->_opcode_engines)
                || $this->_enabled_module_uses_engine('fragmentcache', $this->_opcode_engines)
                || ini_get('opcache.enable') == '1' && ini_get('opcache.validate_timestamps') == '0';
    }

    /**
     * @return bool
     */
    public function can_empty_file() {
        return $this->_enabled_module_uses_engine('pgcache', $this->_file_engines)
                || $this->_enabled_module_uses_engine('dbcache', $this->_file_engines)
                || $this->_enabled_module_uses_engine('objectcache', $this->_file_engines)
                || $this->_enabled_module_uses_engine('minify', $this->_file_engines)
                || $this->_enabled_module_uses_engine('fragmentcache', $this->_file_engines);
    }

    /**
     * @return bool
     */
    public function can_empty_apc_system() {
        return !extension_loaded('apcu') && function_exists('apc_clear_cache') && ini_get('apc.stat') == '0';
    }
    
    /**
     * @return bool
     */
    public function can_empty_opcache_system() {
    	return function_exists('opcache_reset') && ini_get('opcache.validate_timestamps') == '0';
    }

    /**
     * @return mixed
     */
    public function can_empty_varnish() {
        return $this->_config->get_boolean('varnish.enabled');
    }

    /**
     * @param $module
     * @return mixed
     */
    public function get_module_engine($module) {
        return $this->_config->get_string("$module.engine");
    }

    private function _enabled_module_uses_engine($module, $engine) {
        if (is_array($engine))
            return $this->is_enabled($module) && in_array($this->get_module_engine($module), $engine);
        else
            return $this->is_enabled($module) && $this->get_module_engine($module) == $engine;
    }
}
