<?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
                $check_result = $left == $right;
                break;
            case '===':
                $check_result = $left === $right;
                break;
            case '!=':
                // phpcs:ignore
                $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;
    }
}
