@tool
## A trigger that activates when the input is held down for a certain amount of time.
class_name GUIDETriggerHold
extends GUIDETrigger

## The time for how long the input must be held.
@export var hold_treshold:float = 1.0
## If true, the trigger will only fire once until the input is released. Otherwise the trigger will fire every frame.
@export var is_one_shot:bool = false

var _accumulated_time:float = 0
var _did_shoot:bool = false

func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState:
	# if the input is actuated, accumulate time and check if the hold threshold has been reached
	if _is_actuated(input, value_type):
		_accumulated_time += delta
		
		if _accumulated_time >= hold_treshold:
			# if the trigger is one shot and we already shot, then we will not trigger again.
			if is_one_shot and _did_shoot:
				return GUIDETriggerState.NONE
			else:
				# otherwise, we will just trigger.
				_did_shoot = true
				return GUIDETriggerState.TRIGGERED
		else:
			# if the hold threshold has not been reached, then the trigger is ongoing.
			return GUIDETriggerState.ONGOING
	else:
		# if the input is not actuated, then the trigger is not triggered and we reset the accumulated time.
		# and our one shot flag.
		_accumulated_time = 0
		_did_shoot = false
		return GUIDETriggerState.NONE


func _editor_name() -> String:
	return "Hold"

func _editor_description() -> String:
	return "Fires, once the input has remained actuated for hold_threshold seconds.\n" + \
			"My fire once or repeatedly."
