extends Node
# This is where the racing logic is handled (player car input and movement,
# ensuring valid path, ...)
# We keep informations on player progress here.
signal player_moved(track_offset)
signal wrong_way(coords)


# TODO:
# - Keyboard controls !!

var laps  # This is duplicated here becayse of the track offset logic
var current_cell
var next_cell
var track = null
onready var map = $TileMap


func _ready():
	TrackSelection.connect("track_changed", self, "_reset_state")
	_reset_state()


func _input(event):
	match Global.settings.input_mode:
		Global.InputMode.MOUSE:
			_handle_mouse_input(event)
		Global.InputMode.KEYBOARD:
			_handle_keyboard_input(event)


func _handle_keyboard_input(event):
	if event is InputEventKey:
		print_debug("Input Ignored: KEYBOARD MODE")


func _handle_mouse_input(event):
	# Check if the mouse if following the tiles track
	if event is InputEventMouseMotion:
		var hover_cell = map.world_to_map(event.position)
		if hover_cell != current_cell:  # The mouse moved to a new cell
			var cell_idx = track.find(hover_cell)
			# Check the tile is on path
			if cell_idx != -1:
				# Check we are following the path
				if hover_cell == next_cell:
					# Check if lap is completed. The is required
					# because the input can be way ahead player car sprite
					if next_cell == track[0]:
						laps += 1
					# We use the loop property of PathFollow2D to embed
					# laps count inside the offset.
					emit_signal("player_moved", laps + get_track_offset(hover_cell))
					emit_signal("wrong_way", Vector2(-1, -1))
					current_cell = next_cell
					var next_idx = cell_idx + 1 if cell_idx < track.size() - 1 else 0
					next_cell = track[next_idx]
				else:
					emit_signal("wrong_way", map.map_to_world(hover_cell))


func get_track_offset(coords):
	# Returns the offset in Path2D of a track cell.
	var offset = float(track.find(coords)) / float(len(track))
	return offset


func _reset_state():
	track = TrackSelection.get_current_track()
	laps = 0
	current_cell = track[0]
	next_cell = track[1]