extends Camera3D

@export var base_move_speed := 5.0
@export var min_move_speed := 1.0
@export var max_move_speed := 20.0
@export var rotation_speed := 0.002

var input_delay_over := false
var current_move_speed := base_move_speed
var mouse_delta := Vector2.ZERO
var mouse_pos := Vector2.ZERO

func _process(delta):
	if Input.is_action_just_pressed("camera_control"):
		mouse_pos = get_viewport().get_mouse_position()
		input_delay_over = false
		get_tree().create_timer(0.15).timeout.connect(
			func():
				if Input.is_action_pressed("camera_control"):
					input_delay_over = true
		)
	if Input.is_action_pressed("camera_control") and input_delay_over:
		Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
		handle_movement(delta)
		handle_rotation()
	else:
		Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
	if Input.is_action_just_released("camera_control") and input_delay_over:
		Input.warp_mouse(mouse_pos)

func _unhandled_input(event):
	if event is InputEventMouseButton and event.is_pressed():
		handle_scroll_wheel(event)
	if event is InputEventMouseMotion:
		mouse_delta = event.relative

func handle_movement(delta: float) -> void:
	var input_dir = Vector3.ZERO
	if Input.is_key_pressed(KEY_W):
		input_dir.z -= 1
	if Input.is_key_pressed(KEY_S):
		input_dir.z += 1
	if Input.is_key_pressed(KEY_A):
		input_dir.x -= 1
	if Input.is_key_pressed(KEY_D):
		input_dir.x += 1
	if Input.is_key_pressed(KEY_E):
		input_dir.y += 1
	if Input.is_key_pressed(KEY_Q):
		input_dir.y -= 1

	if input_dir.length() > 0:
		input_dir = input_dir.normalized()
		translate(input_dir * current_move_speed * delta)

func handle_rotation() -> void:
	var current_rotation_x = rotation.x - mouse_delta.y * rotation_speed
	current_rotation_x = clamp(current_rotation_x, -1.5, 1.5)
	var current_rotation_y = rotation.y - mouse_delta.x * rotation_speed
	rotation = Vector3(current_rotation_x, current_rotation_y, 0)
	mouse_delta = Vector2.ZERO

func handle_scroll_wheel(event: InputEventMouseButton ) -> void:
	if event.button_index == MOUSE_BUTTON_WHEEL_UP:
		adjust_move_speed(1.0)
	elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
		adjust_move_speed(-1.0)

func adjust_move_speed(delta: float) -> void:
	current_move_speed = clamp(current_move_speed + delta, min_move_speed, max_move_speed)
