# Calculates angular acceleration to rotate a target to face its target's
# position. The behavior attemps to arrive with zero remaining angular velocity.
class_name GSAIFace
extends GSAIMatchOrientation


func _init(agent: GSAISteeringAgent, target: GSAIAgentLocation, use_z := false).(
	agent, target, use_z
) -> void:
	pass


func _face(acceleration: GSAITargetAcceleration, target_position: Vector3) -> void:
	var to_target := target_position - agent.position
	var distance_squared := to_target.length_squared()

	if distance_squared < agent.zero_linear_speed_threshold:
		acceleration.set_zero()
	else:
		var orientation = (
			GSAIUtils.vector3_to_angle(to_target)
			if use_z
			else GSAIUtils.vector2_to_angle(GSAIUtils.to_vector2(to_target))
		)
		_match_orientation(acceleration, orientation)


func _calculate_steering(acceleration: GSAITargetAcceleration) -> void:
	_face(acceleration, target.position)
