extends Camera

const SPEED = 10
const TURN_SENSITIVITY = 0.15

var x_rot : float = 0.0
var y_rot : float = 0.0

var mouse_right_down : bool = false

var input_dir : Vector2 = Vector2()

var key_left : bool = false
var key_right : bool = false
var key_up : bool = false
var key_down : bool = false

var cursor_grabbed : bool = false
var last_cursor_pos : Vector2 = Vector2()

func _physics_process(delta):
	process_input(delta)
	process_movement(delta)

func process_input(delta: float) -> void:
	var key_dir = Vector2()
	
	if key_up:
		key_dir.y -= 1
	if key_down:
		key_dir.y += 1
	if key_left:
		key_dir.x -= 1
	if key_right:
		key_dir.x += 1
		
	input_dir = key_dir

	if input_dir.length_squared() > 0.1:
		input_dir = input_dir.normalized()
	
func _unhandled_input(event : InputEvent) -> void:
	if event is InputEventMouseButton and event.button_index == BUTTON_RIGHT and event.device != -1:
		mouse_right_down = event.pressed
		
	if event is InputEventKey:
		if event.scancode == KEY_W:
			key_up = event.pressed
		if event.scancode == KEY_S:
			key_down = event.pressed
		if event.scancode == KEY_A:
			key_left = event.pressed
		if event.scancode == KEY_D:
			key_right = event.pressed
			
	if event is InputEventMouseMotion and mouse_right_down and event.device != -1:
		rotate_delta(-event.relative.x, -event.relative.y)
			
	update_cursor_mode()
		
func process_movement(delta):
	if input_dir.x > 0.1 or input_dir.y > 0.1 or input_dir.x < -0.1 or input_dir.y < -0.1:
		var forward = transform.basis.xform(Vector3(0, 0, 1))
		
		var right = forward.cross(Vector3(0, 1, 0)) * -input_dir.x
		forward *= input_dir.y #only potentially make it zero after getting the right vector
	
		var dir : Vector3 = forward
		dir += right
		
		if dir.length_squared() > 0.1:
			dir = dir.normalized()
			translation += dir * delta * SPEED

func update_cursor_mode():
	if mouse_right_down:
		if not cursor_grabbed:
			cursor_grabbed = true
			last_cursor_pos = get_viewport().get_mouse_position()
			Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
	else:
		if cursor_grabbed:
			cursor_grabbed = false
			Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
			get_viewport().warp_mouse(last_cursor_pos)
			
func rotate_delta(x_delta : float, y_delta : float) -> void:
	x_rot += y_delta * TURN_SENSITIVITY
	y_rot += x_delta * TURN_SENSITIVITY
	
	x_rot = clamp(x_rot, -90, 90)
	
	if y_rot >= 360:
		y_rot = 0
	if y_rot < 0:
		y_rot = 360
	
	rotation_degrees = Vector3(x_rot, y_rot, 0.0)