extends Area3D

## Schedulable Switch
## States: active, disabled (default)

@export var scheduler_id: String = ""

var player_inside: bool = false
var _current_state: String = "disabled"

# ------------------------------------------------------------------------------
# SCHEDULER INTERFACE (Template-based)
# ------------------------------------------------------------------------------

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": "Switch is visible and interactable",
			"can_affect_facts": ["world.switch_1_pressed"]
		},
		"disabled": { 
			"description": "Switch is hidden and disabled",
			"can_affect_facts": []
		}
	}

func get_scheduler_facts() -> Array:
	return ["world.switch_1_pressed"]

func get_default_state() -> String:
	return "disabled"

func apply_scheduler_state(state_name: String, params: Dictionary = {}) -> void:
	_current_state = state_name
	
	match state_name:
		"active":
			_set_active_state()
		"disabled":
			_set_disabled_state()
		_:
			push_warning("Switch1: Unknown state '%s'" % state_name)

# ------------------------------------------------------------------------------
# INITIALIZATION
# ------------------------------------------------------------------------------

func _ready() -> void:
	body_entered.connect(_on_body_entered)
	body_exited.connect(_on_body_exited)
	# Apply default state
	apply_scheduler_state(get_default_state())

# ------------------------------------------------------------------------------
# STATE IMPLEMENTATIONS
# ------------------------------------------------------------------------------

func _set_active_state() -> void:
	visible = true
	monitoring = true
	monitorable = true
	process_mode = Node.PROCESS_MODE_INHERIT

func _set_disabled_state() -> void:
	visible = false
	monitoring = false
	monitorable = false
	process_mode = Node.PROCESS_MODE_DISABLED

# ------------------------------------------------------------------------------
# SWITCH BEHAVIOR
# ------------------------------------------------------------------------------

func _on_body_entered(body: Node) -> void:
	if _current_state != "active":
		return
	if body.name == "Player":
		player_inside = true

func _on_body_exited(body: Node) -> void:
	if body.name == "Player":
		player_inside = false

func _process(delta: float) -> void:
	if _current_state != "active":
		return
	if not player_inside:
		return
	if Input.is_action_just_pressed("ui_accept"):
		GameFacts.set_fact("world.switch_1_pressed", true)
		GameClock.time_speed_modifier += 0.25
		print("Switch activated! Portal should now appear.")
