## Compares two values using the specified comparison operator.
## Returns [code]FAILURE[/code] if any of the expression fails or the
## comparison operation returns [code]false[/code], otherwise it returns [code]SUCCESS[/code].
@tool
class_name BlackboardCompareCondition extends ConditionLeaf


enum Operators {
	EQUAL,
	NOT_EQUAL,
	GREATER,
	LESS,
	GREATER_EQUAL,
	LESS_EQUAL,
}


## Expression represetning left operand.
## This value can be any valid GDScript expression.
## In order to use the existing blackboard keys for comparison,
## use get_value("key_name") e.g. get_value("direction").length()
@export_placeholder(EXPRESSION_PLACEHOLDER) var left_operand: String = ""
## Comparison operator.
@export_enum("==", "!=", ">", "<", ">=", "<=") var operator: int = 0
## Expression represetning right operand.
## This value can be any valid GDScript expression.
## In order to use the existing blackboard keys for comparison,
## use get_value("key_name") e.g. get_value("direction").length()
@export_placeholder(EXPRESSION_PLACEHOLDER) var right_operand: String = ""


@onready var _left_expression: Expression = _parse_expression(left_operand)
@onready var _right_expression: Expression = _parse_expression(right_operand)


func tick(actor: Node, blackboard: Blackboard) -> int:
	var left: Variant = _left_expression.execute([], blackboard)
	
	if _left_expression.has_execute_failed():
		return FAILURE
	
	var right: Variant = _right_expression.execute([], blackboard)
	
	if _right_expression.has_execute_failed():
		return FAILURE
	
	var result: bool = false
	
	match operator:
		Operators.EQUAL:            result = left == right
		Operators.NOT_EQUAL:        result = left != right
		Operators.GREATER:          result = left > right
		Operators.LESS:             result = left < right
		Operators.GREATER_EQUAL:    result = left >= right
		Operators.LESS_EQUAL:       result = left <= right
	
	return SUCCESS if result else FAILURE


func _get_expression_sources() -> Array[String]:
	return [left_operand, right_operand]
