extends KinematicBody2D

export var clearance_level = 0

# Environment variables
var baseGravity : float = 9.8

# Player movment variables
var maxMoveVelocity : float = 150
var moveAcceleration : float = 125
var moveFriction : float = 65
var jumpVelocity : float = -150
var jumped = false

var moveMotion : float = 0 # Player Input ( <- & -> )
var motion : Vector2 = Vector2(0,0) # Player's current velocity

var gui # Node representing GUI object

var interactables = [] # Objects in range to interact with
var items = [] # Items in player inventory
var equiped = null # Currently equiped item

#==================
# Inventory System
#==================
func add_item(item):
	items.append(item)
	equip_item(item)

func equip_item(item):
	var node = get_node_or_null("Sprite/Torso/RightArm/RightForearm/LeftHand/Node2D/" + item)
	if node:
		equiped = item
		node.show()
	else:
		print("Tried to equip: " + item + " but item was missing!")

#==============
# Interactions
#==============
func add_interactable(interactable):
	interactables.append(interactable)
func remove_interactable(interactable):
	var loc = interactables.find(interactable)
	if loc >= 0:
		interactables.remove(loc)
func interact():
	interactables[0].interact()

#==========
# Game Loop
#===========
func _physics_process(delta):
	jumped = false
	
	# Gravity
	motion.y += baseGravity
	
	if not gui:
		gui = get_node("/root/World/GUI")
	elif not gui.is_in_dialog():
		user_input()
		if jumped:
			motion.y = jumpVelocity
	else:
		moveMotion = 0
	
	# Apply velocity limits
	moveMotion = clamp(moveMotion, -maxMoveVelocity, maxMoveVelocity)
	
	

	# Apply velocity to frame
	motion.x = moveMotion
	animation_manager(moveMotion)
	move_and_slide(motion, Vector2(0,-1))

#===================
# Animation Manager
#===================
#
# Changes animation basd on current
# conditions
func animation_manager(motion : float):

	if not is_on_floor():
			$AnimationPlayer.play("InAir")
	elif jumped:
		if $AnimationPlayer.current_animation != "Jump":
			$AnimationPlayer.play("Jump")
	elif moveMotion > 0:
		$AnimationPlayer.playback_speed = abs(motion)/200
		if $AnimationPlayer.current_animation != "RunRight":
			$AnimationPlayer.play("RunRight")
	elif moveMotion < 0:
		$AnimationPlayer.playback_speed = abs(motion)/200
		if $AnimationPlayer.current_animation != "RunLeft":
			$AnimationPlayer.play("RunLeft")
	else:
		$AnimationPlayer.playback_speed = 1
		$AnimationPlayer.play("Idle")

#============
# User Input
#============
func user_input():
	# Interactions
	if Input.is_action_just_pressed("interact") and len(interactables) > 0 and not gui.is_in_dialog():
		interact()
	
	# Move down platforms
	if is_on_floor() and Input.is_action_just_pressed("ui_up") and Input.is_action_pressed("ui_down"):
		var test_pos = Vector2(position.x,position.y+5)
		if not test_move(Transform2D(0,test_pos), Vector2(0,1)):
			position.y = position.y + 1
			return
	
	# Jumping
	if(is_on_floor() and Input.is_action_just_pressed("ui_up")):
			jumped = true
	
	# Move left and right <- & ->
	if(Input.is_action_pressed("ui_left")):
		moveMotion = -moveAcceleration
	if(Input.is_action_pressed("ui_right")):
		moveMotion = moveAcceleration
	if is_on_floor() and (!Input.is_action_pressed("ui_left") and !Input.is_action_pressed("ui_right")):
		if moveMotion > 0:
			moveMotion = clamp(moveMotion - moveFriction, 0, moveMotion)
		elif moveMotion < 0:
			moveMotion = clamp(moveMotion + moveFriction, moveMotion, 0)