## player.gd
# Player character script. Handles input, pathfinding, and turn-based movement.
class_name Player
extends Character

# Movement speed in pixels per second.
const SPEED: float = 250.0
# Distance threshold for snapping to a tile (prevents jitter).
const ARRIVAL_THRESHOLD: float = 4.0

# The queued path (tile coordinates) the player will walk along.
var _path: Array[Vector2i] = []
# True when the TurnManager is waiting for the player to act.
var _awaiting_input: bool = false
# True while the player is animating toward _move_target.
var _is_moving: bool = false
# World position of the tile the player is currently stepping toward.
var _move_target: Vector2 = Vector2.ZERO


# Called by TurnManager at the start of the player's turn.
func take_turn() -> void:
	if _path.is_empty():
		_awaiting_input = true
	else:
		_start_step()


# Handles mouse input for movement. Only active while awaiting input.
func _unhandled_input(event: InputEvent) -> void:
	if not _awaiting_input:
		return
	if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
		var clicked_tile: Vector2i = LevelManager.world_to_tile(get_global_mouse_position())
		var current_tile: Vector2i = LevelManager.world_to_tile(position)
		_path = LevelManager.find_path(current_tile, clicked_tile)
		# Drop the first entry — it's the tile the player is already on.
		if not _path.is_empty():
			_path.remove_at(0)
		if not _path.is_empty():
			_start_step()


# Begins movement toward the next tile in the queued path.
func _start_step() -> void:
	_awaiting_input = false
	_is_moving = true
	var next_tile: Vector2i = _path.pop_front()
	_move_target = LevelManager.tile_to_world(next_tile)


# Moves the player toward _move_target each frame. Emits turn_finished on arrival.
func _physics_process(_delta: float) -> void:
	if not _is_moving:
		velocity = Vector2.ZERO
		move_and_slide()
		return

	var to_target: Vector2 = _move_target - position

	if to_target.length() < ARRIVAL_THRESHOLD:
		position = _move_target
		velocity = Vector2.ZERO
		move_and_slide()
		_is_moving = false
		turn_finished.emit()
	else:
		velocity = to_target.normalized() * SPEED
		move_and_slide()
