<?php
// +----------------------------------------------------------------------+
// | Copyright 2013  Madpixels  (email : visualizer@madpixels.net)        |
// +----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License, version 2, as  |
// | published by the Free Software Foundation.                           |
// |                                                                      |
// | This program is distributed in the hope that it will be useful,      |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        |
// | GNU General Public License for more details.                         |
// |                                                                      |
// | You should have received a copy of the GNU General Public License    |
// | along with this program; if not, write to the Free Software          |
// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,               |
// | MA 02110-1301 USA                                                    |
// +----------------------------------------------------------------------+
// | Author: Eugene Manuilov <eugene@manuilov.org>                        |
// +----------------------------------------------------------------------+
/**
 * The core plugin class.
 *
 * @category Visualizer
 *
 * @since 1.0.0
 */
class Visualizer_Plugin {

	const NAME = 'visualizer';
	const VERSION = '4.0.4';

	// custom post types
	const CPT_VISUALIZER = 'visualizer';

	// custom meta fields
	const CF_CHART_IMAGE = 'visualizer-chart-image';
	const CF_CHART_TYPE = 'visualizer-chart-type';
	const CF_SOURCE = 'visualizer-source';
	const CF_SERIES = 'visualizer-series';
	const CF_DEFAULT_DATA = 'visualizer-default-data';
	const CF_SETTINGS = 'visualizer-settings';
	const CF_CHART_LIBRARY = 'visualizer-chart-library';
	const CF_ERROR = 'visualizer-error';
	const CF_REMOTE_DB_PARAMS = 'visualizer-remote-db-params';

	const CF_SOURCE_FILTER = 'visualizer-source-filter';
	const CF_FILTER_CONFIG = 'visualizer-filter-config';
	const CF_EDITABLE_TABLE = 'visualizer-editable-table';

	// custom actions
	const ACTION_GET_CHARTS = 'visualizer-get-charts';
	const ACTION_CREATE_CHART = 'visualizer-create-chart';
	const ACTION_EDIT_CHART = 'visualizer-edit-chart';
	const ACTION_CLONE_CHART = 'visualizer-clone-chart';
	const ACTION_DELETE_CHART = 'visualizer-delete-chart';
	const ACTION_UPLOAD_DATA = 'visualizer-upload-data';
	const ACTION_EXPORT_DATA = 'visualizer-export-data';

	const STORE_URL = 'https://store.themeisle.com/';

	/**
	 *Action used for fetching specific users/roles for permissions.
	 */
	const ACTION_FETCH_PERMISSIONS_DATA = 'visualizer-fetch-permissions-data';

	/**
	 *Action used for fetching db import data.
	 */
	const ACTION_FETCH_DB_DATA = 'visualizer-fetch-db-data';
	const ACTION_SAVE_DB_QUERY = 'visualizer-save-db-query';

	const ACTION_JSON_GET_ROOTS = 'visualizer-json-get-roots';
	const ACTION_JSON_GET_DATA = 'visualizer-json-get-data';
	const ACTION_JSON_SET_DATA = 'visualizer-json-set-data';
	const ACTION_JSON_SET_SCHEDULE = 'visualizer-json-set-schedule';
	const CF_JSON_URL = 'visualizer-json-url';
	const CF_JSON_ROOT = 'visualizer-json-root';
	const CF_JSON_SCHEDULE = 'visualizer-json-schedule';
	const CF_JSON_PAGING = 'visualizer-json-paging';
	const CF_JSON_HEADERS = 'visualizer-json-headers';
	const CF_EDITOR = 'visualizer-editor';

	const ACTION_SAVE_FILTER_QUERY = 'visualizer-save-filter-query';

	// custom filters
	const FILTER_CHART_WRAPPER_CLASS = 'visualizer-chart-wrapper-class';
	const FILTER_GET_CHART_SERIES = 'visualizer-get-chart-series';
	const FILTER_GET_CHART_DATA = 'visualizer-get-chart-data';
	const FILTER_GET_CHART_SETTINGS = 'visualizer-get-chart-settings';
	const FILTER_UNDO_REVISIONS = 'visualizer-undo-revisions';
	const FILTER_HANDLE_REVISIONS = 'visualizer-handle-revisions';
	const FILTER_GET_CHART_DATA_AS = 'visualizer-get-chart-data-as';
	const FILTER_HANDLE_CACHE_EXPIRATION_TIME = 'visualizer-handle-expiration-time';
	const FILTER_CHART_TITLE = 'the_title';

	const CF_DB_SCHEDULE = 'visualizer-db-schedule';
	const CF_DB_QUERY = 'visualizer-db-query';

	const CF_CHART_URL = 'visualizer-chart-url';
	const CF_CHART_SCHEDULE = 'visualizer-chart-schedule';
	// Added by Ash/Upwork
	const PRO_TEASER_URL = 'https://themeisle.com/plugins/visualizer-charts-and-graphs/upgrade/';
	const PRO_TEASER_TITLE = 'Check PRO version ';

	const CF_CHART_CACHE = 'visualizer-chart-cache';
	const CF_JSON_WOOCOMMERCE_SOURCE = 'visualizer-woocommerce-source';
	const CF_IS_WOOCOMMERCE_SOURCE = 'visualizer-is-woocommerce-source';

	/**
	 * Name of the option for WordPress DB.
	 */
	const WP_DB_NAME = 'WordPress DB';

	// Added by Ash/Upwork
	/**
	 * Singletone instance of the plugin.
	 *
	 * @since 1.0.0
	 *
	 * @access private
	 * @var Visualizer_Plugin
	 */
	private static $_instance = null;

	/**
	 * The array of registered modules.
	 *
	 * @since 1.0.0
	 *
	 * @access private
	 * @var array
	 */
	private $_modules = array();

	/**
	 * Returns the date queries supported in the library date filter.
	 */
	public static function getSupportedDateFilter() {
		return apply_filters( 'visualizer_filter_by_date', array( '' => __( 'All dates', 'visualizer' ), 'yesterday' => __( 'Yesterday', 'visualizer' ), 'last week' => __( 'Last Week', 'visualizer' ), 'last month' => __( 'Last Month', 'visualizer' ), 'last year' => __( 'Last Year', 'visualizer' ) ) );
	}

	/**
	 * Private constructor.
	 *
	 * @since 1.0.0
	 *
	 * @access private
	 */
	private function __construct() {
		if ( VISUALIZER_DEBUG ) {
			add_action( 'themeisle_log_event', array( $this, 'themeisle_log_event_debug' ), 10, 5 );
		}
	}

	/**
	 * Returns singletone instance of the plugin.
	 *
	 * @since 1.0.0
	 *
	 * @static
	 * @access public
	 * @return Visualizer_Plugin
	 */
	public static function instance() {
		if ( is_null( self::$_instance ) ) {
			self::$_instance = new Visualizer_Plugin();
		}

		return self::$_instance;
	}

	/**
	 * Returns chart types.
	 *
	 * @since 1.0.0
	 *
	 * @static
	 * @access public
	 * @return array
	 */
	public static function getChartTypes() {
		$array = array_keys( Visualizer_Module_Admin::_getChartTypesLocalized() );

		return $array;
	}

	/**
	 * Returns a module if it was registered before. Otherwise NULL.
	 *
	 * @since 1.0.0
	 *
	 * @access public
	 *
	 * @param string $name The name of the module to return.
	 *
	 * @return Visualizer_Module|null Returns a module if it was registered or NULL.
	 */
	public function getModule( $name ) {
		return isset( $this->_modules[ $name ] ) ? $this->_modules[ $name ] : null;
	}

	/**
	 * Determines whether the module has been registered or not.
	 *
	 * @since 1.0.0
	 *
	 * @access public
	 *
	 * @param string $name The name of a module to check.
	 *
	 * @return boolean TRUE if the module has been registered. Otherwise FALSE.
	 */
	public function hasModule( $name ) {
		return isset( $this->_modules[ $name ] );
	}

	/**
	 * Register new module in the plugin.
	 *
	 * @since 1.0.0
	 *
	 * @access public
	 *
	 * @param string $class_name The name of the module to use in the plugin.
	 */
	public function setModule( $class_name ) {
		$this->_modules[ $class_name ] = new $class_name( $this );
	}

	/**
	 * Private clone method.
	 *
	 * @since 1.0.0
	 *
	 * @access private
	 */
	private function __clone() {
	}

	/**
	 * For local testing, overrides the 'themeisle_log_event' hook and redirects to error.log.
	 */
	final public function themeisle_log_event_debug( $name, $message, $type, $file, $line ) {
		if ( Visualizer_Plugin::NAME !== $name ) {
			return;
		}
		error_log( sprintf( '%s (%s): %s in %s:%s', $name, $type, $message, $file, $line ) );
	}
}
