'''工具类：用于解析 State / 路径 / 展示信息'''
@tool
class_name StateResolveUtils


# =====================================================
# Section 1: Drag Data → State Path / State Node
# =====================================================
static func is_valid_state_drag(data) -> bool:
	return get_state_node_from_drag(data) != null


static func get_state_path_from_drag(data) -> NodePath:
	var raw := _extract_node_path_from_drag(data)
	if raw.is_empty():
		return NodePath()

	return _normalize_to_scene_root(raw)


static func get_state_node_from_drag(data) -> ReedPropState:
	var path := get_state_path_from_drag(data)
	if path.is_empty():
		return null

	return get_state_node_from_path(path)


# =====================================================
# Section 2: NodePath → State Node
# =====================================================
static func get_state_node_from_path(path: NodePath) -> ReedPropState:
	if path.is_empty():
		return null

	var root := EditorInterface.get_edited_scene_root()
	if root == null:
		return null

	var node := root.get_node_or_null(path)
	if node is ReedPropState:
		return node

	return null


# =====================================================
# Section 3: State Node → 展示信息
# =====================================================

static func resolve_state_display_info(state: ReedPropState) -> Dictionary:
	var result := {
		"prop_name": "",
		"prop_id": -1,
		"state_name": "",
		"state_id": -1
	}

	if state == null:
		return result

	# --------------------
	# State 信息
	# --------------------
	result.state_name = state.get_state_name()
	result.state_id = str(state.state_id)

	# --------------------
	# PropComponent
	# --------------------
	var prop_comp := _find_parent_prop_comp(state)
	if prop_comp == null:
		return result

	result.prop_id = str(prop_comp.prop_id)

	# --------------------
	# Prop 实体节点（PropComponent 的父节点）
	# --------------------
	var prop_node := prop_comp.get_parent()
	if prop_node:
		result.prop_name = prop_node.name

	return result


# =====================================================
# Section 4: Internal helpers
# =====================================================

static func _extract_node_path_from_drag(data) -> NodePath:
	if typeof(data) != TYPE_DICTIONARY:
		return NodePath()

	# SceneTree 标准：nodes = [NodePath / String]
	if data.has("nodes") and data["nodes"] is Array and data["nodes"].size() > 0:
		var first = data["nodes"][0]
		if first is NodePath:
			return first
		if typeof(first) == TYPE_STRING:
			return NodePath(first)

	# 少见兜底：直接给了 node
	if data.has("node") and data["node"] is Node:
		return (data["node"] as Node).get_path()

	return NodePath()


static func _normalize_to_scene_root(p: NodePath) -> NodePath:
	if p.is_empty():
		return p

	var root := EditorInterface.get_edited_scene_root()
	if root == null:
		return p

	var root_path := String(root.get_path())
	var s := String(p)

	# 已经是相对路径
	if not s.begins_with("/"):
		return p

	if s.begins_with(root_path):
		s = s.substr(root_path.length())
		if s.begins_with("/"):
			s = s.substr(1)

	return NodePath(s)


static func _find_parent_prop_comp(state: Node) -> PropComponent:
	var cur := state.get_parent()
	while cur:
		if cur is PropComponent:
			return cur
		cur = cur.get_parent()
	return null

## 通过Path返回ID和State
static func resolve_ids_from_state_path(path: NodePath) -> Dictionary:
	var result := {
		"prop_id": -1,
		"state_id": -1
	}

	var root := EditorInterface.get_edited_scene_root()
	if root == null:
		return result

	var node := root.get_node_or_null(path)
	if not (node is ReedPropState):
		return result

	result.state_id = node.state_id

	var prop_comp := _find_parent_prop_comp(node)
	if prop_comp == null:
		return result

	result.prop_id = prop_comp.prop_id
	return result

## 通过id 获取Name
static func resolve_names_from_ids(
	prop_id: int,
	state_id: int
) -> Dictionary:
	var result := {
		"prop_name": "",
		"state_name": ""
	}

	var root := EditorInterface.get_edited_scene_root()
	if root == null:
		return result

	# 遍历 PropComponent（你之后可以优化成表）
	for prop_comp in root.get_tree().get_nodes_in_group("PropComponent"):
		if prop_comp.prop_id != prop_id:
			continue

		var prop_node := prop_comp.get_parent()
		if prop_node:
			result.prop_name = prop_node.name

		for child in prop_comp.get_children():
			if child is ReedPropState and child.state_id == state_id:
				result.state_name = child.name
				return result

	return result
