extends KinematicBody

class_name Player

var attackRate : float = 0.3
var lastAttackTime : int = 0

# physics
var airborneSpeed : float = 3.0
var walkSpeed : float = 5.0
var runSpeed : float = 10.0
var jumpForce : float = 10.0
var gravity : float = 15.0
 
var vel := Vector3()
 
# components
onready var camera = get_node("CameraOrbit")
onready var interactCast = get_node("InteractRayCast")
onready var anim = get_node("Casual2_Female/AnimationPlayer")

func _process(delta):
	# attack input
	if Controller.player_input_enabled and is_on_floor() and Input.is_action_just_pressed("interact"):
		try_interact()

# called every physics step (60 times a second)
func _physics_process (delta):
	var input := Vector3()
		
	# gravity
	vel.y -= gravity * delta
	
	if Controller.player_input_enabled :
		# movement inputs
		if Input.is_action_pressed("move_forward"):
			input.z += 1
		if Input.is_action_pressed("move_backward"):
			input.z -= 1
		if Input.is_action_pressed("move_left"):
			input.x += 1
		if Input.is_action_pressed("move_right"):
			input.x -= 1
			
		input = input.normalized()
		
		# get the relative direction
		var dir := (transform.basis.z * input.z + transform.basis.x * input.x)
		
		# apply the direction to our velocity
		if not is_on_floor():
			vel.x = lerp(vel.x, dir.x * airborneSpeed, .5 * delta)
			vel.z = lerp(vel.z, dir.z * airborneSpeed, .5 * delta)
		elif Input.is_action_pressed("run"):
			vel.x = dir.x * runSpeed
			vel.z = dir.z * runSpeed
		else:
			vel.x = dir.x * walkSpeed
			vel.z = dir.z * walkSpeed
			
		# jump input
		if Input.is_action_pressed("jump") and is_on_floor():
			vel.y = jumpForce
	else:
		vel.x = 0
		vel.z = 0
	
	if is_on_floor():
		if anim.current_animation != "Punch":
			if input.x != 0 || input.z != 0:
				if Controller.player_input_enabled and Input.is_action_pressed("run"):
					anim.play("Run")
				else:
					anim.play("Walk")
			else:
				anim.play("Idle")
	else:
		anim.play("RecieveHit")
	
	# move along the current velocity
	var previous_vel = vel
	vel = move_and_slide(vel, Vector3.UP, true, 4, deg2rad(30))
	
	if is_on_wall():
		vel.y = min(previous_vel.y, vel.y)

# called when we collect a coin
func give_gold (amount):
	var gold = Controller.player_infos.gold
	gold += amount
	Controller.player_infos.gold = gold

# called when an enemy deals damage to us
func take_damage (damageToTake):
	Controller.player_infos.curHp -= damageToTake
	
	# if our health is 0, die
	if Controller.player_infos.curHp <= 0:
		die()

# called when our health reaches 0
func die ():
	# reload the scene
	get_tree().reload_current_scene()
	
## called when we press the attack button
#func try_attack():
#	# if we're not ready to attack, return
#	if OS.get_ticks_msec() - lastAttackTime < attackRate * 1000:
#		return
#
#	# set the last attack time to now
#	lastAttackTime = OS.get_ticks_msec()
#
#	# play the animation
#	anim.stop()
#	anim.play("Punch")
#
#	# is the ray cast colliding with an enemy?
#	if attackCast.is_colliding():
#		if attackCast.get_collider().has_method("take_damage"):
#			attackCast.get_collider().take_damage(damage)
#		if attackCast.get_collider().has_signal("on_interact"):
#			attackCast.get_collider().emit_signal("on_interact")


# called when we press the interact button
func try_interact():
	# is the ray cast colliding with an enemy?
	if interactCast.is_colliding():
		# play the animation
		anim.stop()
		anim.play("Idle")
		if interactCast.get_collider().has_signal("on_interact"):
			interactCast.get_collider().emit_signal("on_interact")
