@tool
class_name XRToolsDesktopMovementTurn
extends XRToolsMovementProvider


## XR Tools Movement Provider for Turning
##
## This script provides turning support for the player. This script works
## with the PlayerBody attached to the players XROrigin3D.


## Movement mode
enum TurnMode {
	DEFAULT,	## Use turn mode from project/user settings
	SNAP,		## Use snap-turning
	SMOOTH		## Use smooth-turning
}


## Movement provider order
@export var order : int = 6

## Movement mode property
@export var turn_mode : TurnMode = TurnMode.SMOOTH

## Smooth turn speed in radians per second
@export var smooth_turn_speed : float = 2.0

## Seconds per step (at maximum turn rate)
@export var step_turn_delay : float = 0.2

## Step turn angle in degrees
@export var step_turn_angle : float = 20.0

## Our directional input
@export var input_action : String = "primary"

## Our directional input
@export var clear_mouse_move_when_body_not_active : bool = true
@export var clear_cam_x_when_body_not_active : bool = false


@export var invert_y : bool = true

var plr_body : XRToolsPlayerBody
var mouse_move_vector := Vector2.ZERO
var _last_plr_bd_status := true

# Turn step accumulator
var _turn_step : float = 0.0



# XRStart node
@onready var xr_start_node = XRTools.find_xr_child(
	XRTools.find_xr_ancestor(self,
	"*Staging",
	"XRToolsStaging"),"StartXR","Node")


# Add support for is_xr_class on XRTools classes
func is_xr_class(name : String) -> bool:
	return name == "XRToolsDesktopMovementTurn" or super(name)

func _unhandled_input(event):
	if !enabled:
		return
	if event is InputEventMouseMotion:
		event.relative*=.1
		if invert_y:
			event.relative.y *= -1
		mouse_move_vector += event.relative

func _process(_delta: float) -> void:
	if is_instance_valid(plr_body):
		if !plr_body.enabled and !xr_start_node.is_xr_active() and _last_plr_bd_status!=plr_body.enabled:
			if clear_mouse_move_when_body_not_active:
				mouse_move_vector=Vector2.ZERO
			if clear_cam_x_when_body_not_active:
				plr_body.camera_node.rotation_degrees.x=0
			_last_plr_bd_status=!plr_body.enabled
		elif plr_body.enabled:
			_last_plr_bd_status=!plr_body.enabled


# Perform jump movement
func physics_movement(delta: float, player_body: XRToolsPlayerBody, _disabled: bool):
	# Skip if the player body isn't active
	plr_body=player_body
	if !player_body.enabled or xr_start_node.is_xr_active():
		if clear_mouse_move_when_body_not_active:
			mouse_move_vector=Vector2.ZERO
		#if clear_cam_x_when_body_not_active:
		#	player_body.camera_node.rotation_degrees.x=0
		return

	var deadzone = 0.1
#	if _snap_turning():
#		deadzone = XRTools.get_snap_turning_deadzone()

	# Read the left/right joystick axis
	var left_right := mouse_move_vector.x
	#if abs(left_right) <= deadzone:
	#	# Not turning
	#	_turn_step = 0.0
	#	return

	# Handle smooth rotation
	#if !_snap_turning():
	left_right -= deadzone * sign(left_right)
	player_body.rotate_player(smooth_turn_speed * delta * left_right)
	player_body.camera_node.rotation_degrees.x=clamp(
		player_body.camera_node.rotation_degrees.x+smooth_turn_speed * mouse_move_vector.y,
		-89.999,
		89.999)
	mouse_move_vector=Vector2.ZERO
	return



# Test if snap turning should be used
func _snap_turning():
	#temp removal - IDK if normal controler will be considered to have this as use
	return false
#	match turn_mode:
#		TurnMode.SNAP:
#			return true
#
#		TurnMode.SMOOTH:
#			return false
#
#		_:
#			return XRToolsUserSettings.snap_turning