<?php
namespace ElementorExtras\Base;

// Extras for Elementor Classes
use ElementorExtras\Utils;

// Elementor Classes
use Elementor\Controls_Manager;

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

/**
 * \Base\Condition
 *
 * @since  2.2.0
 */
abstract class Condition {

	/**
	 * @var Module_Base
	 */
	protected static $_instances = [];

	protected $element_id;

	/**
	 * Return the current module class name
	 *
	 * @access public
	 * @since 1.6.0
	 *
	 * @eturn string
	 */
	public static function class_name() {
		return get_called_class();
	}

	/**
	 * @return static
	 */
	public static function instance() {
		if ( empty( static::$_instances[ static::class_name() ] ) ) {
			static::$_instances[ static::class_name() ] = new static();
		}

		return static::$_instances[ static::class_name() ];
	}

	/**
	 * Checks if current condition is supported
	 * Defaults to true
	 *
	 * @since  2.2.0
	 * @return string
	 */
	public static function is_supported() {
		return true;
	}

	/**
	 * Get Group
	 * 
	 * Get the group of the condition
	 *
	 * @since  2.2.0
	 * @return string
	 */
	public function get_group() {}

	/**
	 * Get Name
	 * 
	 * Get the name of the module
	 *
	 * @since  2.2.0
	 * @return string
	 */
	public function get_name() {}

	/**
	 * Get Name
	 * 
	 * Get the title of the module
	 *
	 * @since  2.2.0
	 * @return string
	 */
	public function get_title() {}

	/**
	 * Get Default Value
	 * 
	 * Get the default value of the value control
	 *
	 * @since  2.2.0
	 * @return string
	 */
	public function get_name_control() { return false; }

	/**
	 * Get Default Value
	 * 
	 * Get the default value of the value control
	 *
	 * @since  2.2.0
	 * @return string
	 */
	public function get_value_control() {}

	/**
	 * Check user login status
	 *
	 * @since 2.0.0
	 *
	 * @access protected
	 *
	 * @param mixed  $name  	The control name to check
	 * @param mixed  $value  	The control value to check
	 * @param string $operator  Comparison operator.
	 */
	public function check( $name = null, $operator, $value ) {}

	/**
	 * Compare conditions.
	 *
	 * Calls compare method
	 *
	 * @since 2.2.0
	 * @access public
	 * @static
	 *
	 * @param mixed  $left_value  First value to compare.
	 * @param mixed  $right_value Second value to compare.
	 * @param string $operator    Comparison operator.
	 *
	 * @return bool
	 */
	public function compare( $left_value, $right_value, $operator ) {
		return Utils::compare( $left_value, $right_value, $operator );
	}

	/**
	 * Set Condition Element ID
	 * 
	 * Set the element ID for this condition
	 *
	 * @since  2.2.27
	 * @return string
	 */
	public function set_element_id( $id ) {
		$this->element_id = $id;
	}

	/**
	 * Get Condition Element ID
	 * 
	 * Returns the previously set element id
	 *
	 * @since  2.2.27
	 * @return string
	 */
	protected function get_element_id() {
		return $this->element_id;
	}
}
