extends Node2D

class_name FSM

@export var root : Node

var states = ['idle']
var current_state = null
var previous_state = null
var next_state = null
var state_duration = 0

func set_states(new_states):
	self.states = new_states

func _ready():
	pass

func _physics_process(delta):
	if current_state == null:
		next_state = states[0]
		_transition()
		return

	if "before_state" in root:
		root.call("before_state", delta)

	var current_state_method = current_state + "_state"
	if current_state_method in root:
		root.call(current_state_method, delta)

	if "after_state" in root:
		root.call("after_state", delta)

	state_duration += delta
	_transition()


func _transition():
	if next_state != null:
		previous_state = current_state
		current_state = next_state
		next_state = null
		print(get_parent().name + " transitioning to " + current_state)

		if previous_state:
			var on_exit_state_method =  "on_exit_" + previous_state + "_state"
			if on_exit_state_method in root:
				root.call(on_exit_state_method)

		state_duration = 0
		var on_enter_state_method =  "on_enter_" + current_state + "_state"
		if on_enter_state_method in root:
			root.call(on_enter_state_method)

func set_next_state(state):
	next_state = state
