extends Node

# Player AI
var ignore_input = false
var body_exit_signal = false # interact_input()
var interact_target = null
var velocity_sum = Vector2(0.0,0.0)

# Setters + Getters
func set_ignore_input(new_bool):
	ignore_input = new_bool
func get_ignore_input():
	return ignore_input
func get_user():
	return get_parent()

### LOGIC ###

# Get Player Input
func get_input():
	if not ignore_input:
		get_movement_input()
		get_interact_input()

### INTERACTING ###

# Listen for Hotkey for Interacting
func get_interact_input():
## Interact Hotkey
	if Input.is_action_just_pressed('interact'):
## Get overlapping bodies from range bubble
		var bodies = get_user().get_overlapping_bodies() 
		#var areas = get_user().get_overlapping_areas()
## Exclusions
		for body in bodies:
			if !body.has_method("get_user"):
				bodies.erase(body)
			if body.has_method("get_user") and body.get_user().is_player():
				bodies.erase(body)
		#for area in areas:
		#	if area.has_method("get_user"):
		#		areas.erase(area)
## Collect Interactable Targets in Range
		var interact_targets = []
		for b in bodies:
			if b.get_user().is_in_group("can_interact"):
				interact_targets.append(b.get_user())
		#for a in areas:
		#	if a.get_user().is_in_group("can_interact"):
		#		interact_targets.append(a.get_user())
## Find Nearest Interactable Target
		if interact_targets:
			interact_targets.sort_custom(FoeSorter.new(get_user().get_gpos()), "sort")
			#get_user().set_target(interact_targets[0])
			interact_targets[0].interact()

# Foe Finder System
class FoeSorter:
	var point = null
	func _init(new_point):
		self.point = new_point
	func sort(a, b):
		return self.point.distance_to(a.get_gpos()) < self.point.distance_to(b.get_gpos())

### MOVEMENT ###

# Get Movement Key Input
func get_movement_input():
	if Input.is_action_pressed('ui_right'):
		movement_key_pressed(1)
	if Input.is_action_pressed('ui_left'):
		movement_key_pressed(2)
	if Input.is_action_pressed('ui_up'):
		movement_key_pressed(3)
	if Input.is_action_pressed('ui_down'):
		movement_key_pressed(4)
	if Input.is_action_just_released("ui_right"):
		movement_key_released(1)
	if Input.is_action_just_released("ui_left"):
		movement_key_released(2)
	if Input.is_action_just_released("ui_up"): 
		movement_key_released(3)
	if Input.is_action_just_released("ui_down"):
		movement_key_released(4)

# WASD Movement
func movement_key_pressed(direction):
	get_user().set_internal_velocity(Vector2(0.0,0.0))
	if direction == 1: # right
		velocity_sum.x = 0
		velocity_sum.x += 1
		get_user().animate("WalkRight")
	elif direction == 2: # left
		velocity_sum.x = 0
		velocity_sum.x -= 1
		get_user().animate("WalkLeft")
	elif direction == 3: # up
		velocity_sum.y = 0
		velocity_sum.y -= 1
		get_user().animate("WalkUp")
	elif direction == 4: # down
		velocity_sum.y = 0
		velocity_sum.y += 1
		get_user().animate("WalkDown")
# Velocity cannot be faster with more vectors
	get_user().set_internal_velocity(velocity_sum)

func movement_key_released(direction):
	if direction == 1 or direction == 2: # left/right
		velocity_sum.x = 0
	elif direction == 3 or direction == 4: # up/down
		velocity_sum.y = 0
	get_user().animate("Idle")
	get_user().set_internal_velocity(velocity_sum)

### PHYSICS PROCESS

# Physics Process
func _physics_process(_delta):
## Keyboard Movement
	get_input()
