@tool
@icon("res://addons/reedscene/prop/icon/prop_state_icon.svg")
class_name ReedPropState extends Node

##状态编号，默认为-1，-1是不可用编号，状态编号由StateManager发布，不可以自己修改。
@export_custom(PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY) var state_id: int  = -1
##该State的信息是否需要被存入Save中
@export var save_game: bool = false

##预装的一些Effect，可以用来对State进行一些初始化
@export var effects: Array[ReedPropEffect] = []

const DEFAULT_NAME = "Default"

##State的拥有者
var _owner
##State的prop comp
var _owner_prop_comp
## 是否已经初始化
var _inited: bool = false
## State的真实name，默认会去掉ID
var _true_name: StringName = ""

func _enter_tree() -> void:
	_true_name = _get_true_name()
	
	if not self.renamed.is_connected(_on_renamed):
		self.renamed.connect(_on_renamed)

## 在命名修改的时候，会自动的更正缓存的TrueName
func _on_renamed() -> void:
	_true_name = _get_true_name()

func _get_true_name() -> String:
	var s = get_parent()
	if s and s.has_method(&"_strip_id_prefix"):
		return s._strip_id_prefix(self.name)
	return self.name

##初始化State
func init(owner: Node, prop_comp: Node) -> bool:
	# 防止重复初始化
	if _inited:
		push_warning("ReedPropState [%s] already initialized." % name)
		return false

	if owner == null:
		push_error("ReedPropState [%s] init failed: owner is null." % name)
		return false

	if prop_comp == null:
		push_error("ReedPropState [%s] init failed: prop_comp is null." % name)
		return false

	_owner = owner
	_owner_prop_comp = prop_comp
	_inited = true
	return true

##是否可以进入此状态，默认为真
func can_enter(_current: ReedPropState, _ctx: Dictionary) -> bool:
	return true

##State进入
func on_enter(_from: ReedPropState, _ctx: Dictionary) -> void:
	if not _inited:
		push_error("ReedPropState [%s] entered before init!" % name)
		return
	
	for e in effects:
		e.apply(_owner, _owner_prop_comp, _ctx)

##State退出
func on_exit(_to: ReedPropState, _ctx: Dictionary) -> void:
	pass

## 外部可以通过state的引用返回真实名
func get_state_name() -> StringName:
	return _true_name
