extends Area3D

## Schedulable Teleport Portal
## States: active, inactive (default)

@export var target_scene_path: String = ""
@export var scheduler_id: String = ""

var _is_teleporting: bool = false
var _current_state: String = "inactive"

# Scheduler integration
func _enter_tree() -> void:
	if scheduler_id == "":
		var zone_name := "UNKNOWN"
		if owner:
			zone_name = owner.name.to_upper()
		elif get_parent():
			zone_name = get_parent().name.to_upper()
		scheduler_id = "%s.%s" % [zone_name, name]
	
	if GameManager and not Engine.is_editor_hint():
		GameManager.register_entity(scheduler_id, self)

func _exit_tree() -> void:
	if GameManager and not Engine.is_editor_hint():
		GameManager.unregister_entity(scheduler_id)

func get_scheduler_states() -> Dictionary:
	return {
		"active": { "description": "Portal is visible and functional" },
		"inactive": { "description": "Portal is hidden and disabled (default)" }
	}

func get_default_state() -> String:
	return "inactive"

func apply_scheduler_state(state_name: String, params: Dictionary = {}) -> void:
	_current_state = state_name
	
	match state_name:
		"active":
			_set_active_state()
		"inactive":
			_set_inactive_state()
		_:
			push_warning("TeleportPortal: Unknown state '%s'" % state_name)

func _ready() -> void:
	body_entered.connect(_on_body_entered)
	# Apply default state
	apply_scheduler_state(get_default_state())

func _on_body_entered(body: Node) -> void:
	# Only teleport if in active state
	if _current_state != "active":
		return
	if _is_teleporting:
		return
	if not (body is CharacterBody3D):
		return
	if body.name != "Player":
		return
	if target_scene_path.is_empty():
		return
	_is_teleporting = true
	get_tree().change_scene_to_file(target_scene_path)

# State implementations
func _set_active_state() -> void:
	visible = true
	monitoring = true
	monitorable = true
	# Enable collision
	for child in get_children():
		if child is CollisionShape3D:
			child.disabled = false

func _set_inactive_state() -> void:
	visible = false
	monitoring = false
	monitorable = false
	# Disable collision
	for child in get_children():
		if child is CollisionShape3D:
			child.disabled = true
