<?php
/**
 * Control condition check.
 *
 * @package visual-portfolio
 */

/**
 * Visual_Portfolio_Control_Condition_Check
 */
class Visual_Portfolio_Control_Condition_Check {
	/**
	 * Compare 2 values
	 *
	 * @param mixed  $left Left value.
	 * @param string $operator Operator.
	 * @param mixed  $right Right value.
	 *
	 * @return boolean
	 */
	public static function compare( $left, $operator, $right ) {
		$check_result = true;

		switch ( $operator ) {
			case '==':
				// phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
				// phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
				$check_result = $left == $right;
				break;
			case '===':
				$check_result = $left === $right;
				break;
			case '!=':
				// phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
				// phpcs:ignore Universal.Operators.StrictComparisons.LooseNotEqual
				$check_result = $left != $right;
				break;
			case '!==':
				$check_result = $left !== $right;
				break;
			case '*=':
				$check_result = strpos( $left, $right ) !== false;
				break;
			case '>=':
				$check_result = $left >= $right;
				break;
			case '<=':
				$check_result = $left <= $right;
				break;
			case '>':
				$check_result = $left > $right;
				break;
			case '<':
				$check_result = $left < $right;
				break;
			case '&&':
			case 'AND':
				$check_result = $left && $right;
				break;
			case '||':
			case 'OR':
				$check_result = $left || $right;
				break;
			default:
				$check_result = $left;
				break;
		}

		return $check_result;
	}

	/**
	 * Conditions check for controls.
	 *
	 * @param array  $condition - condition params.
	 * @param array  $attributes - block attributes.
	 * @param string $relation - Can be one of 'AND' or 'OR'.
	 *
	 * @return boolean is check pass.
	 */
	public static function check( $condition, $attributes, $relation = 'AND' ) {
		// by default result will be TRUE for relation AND
		// and FALSE for relation OR.
		$result         = 'AND' === $relation;
		$child_relation = $result ? 'OR' : 'AND';

		foreach ( $condition as $data ) {
			if ( is_array( $data ) && ! isset( $data['control'] ) ) {
				$result = self::compare( $result, $relation, self::check( $data, $attributes, $child_relation ) );
			} elseif ( isset( $data['control'] ) ) {
				$left     = Visual_Portfolio_Control_Get_Value::get( $data['control'], $attributes );
				$operator = isset( $data['operator'] ) ? $data['operator'] : '==';
				$right    = isset( $data['value'] ) ? $data['value'] : 'true';

				if ( 'true' === $left ) {
					$left = true;
				} elseif ( 'false' === $left ) {
					$left = false;
				}

				if ( 'true' === $right ) {
					$right = true;
				} elseif ( 'false' === $right ) {
					$right = false;
				}

				$result = self::compare( $result, $relation, self::compare( $left, $operator, $right ) );
			}
		}

		return $result;
	}
}
