extends Node2D

const INACTIVE_IDX = -1;

export (String) var listenerNodePath : String = "../../../../../.."
export (String) var padname : String = ""

var parent : Control

var centerPoint = Vector2(0,0)
var currentForce = Vector2(0,0)
var last_pointer_position : Vector2 = Vector2()

var currentPointerIDX = INACTIVE_IDX;

var listener : Node = null

func _ready():
	parent = get_node("..")
	listener = get_node(listenerNodePath)
	
	if listener != null:
		if not listener.has_method("queue_camera_rotation"):
			listener = null
	
	set_process_input(true)

func get_force():
	return currentForce
	
func _input(event):	
	var incomingPointer = extractPointerIdx(event)

	if incomingPointer == INACTIVE_IDX:
		return
	
	if need2ChangeActivePointer(event):
		if (currentPointerIDX != incomingPointer) and event.is_pressed():
			currentPointerIDX = incomingPointer;
			last_pointer_position = Vector2(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y);
			
			get_tree().set_input_as_handled()

	var theSamePointer = currentPointerIDX == incomingPointer
	if isActive() and theSamePointer:
		process_input(event)

func need2ChangeActivePointer(event): #touch down inside analog	
	if event is InputEventMouseButton or event is InputEventScreenTouch:
		return parent.get_global_rect().has_point(Vector2(event.position.x, event.position.y))
	else:
		return false

func isActive():
	return currentPointerIDX != INACTIVE_IDX

func extractPointerIdx(event):
	var touch = event is InputEventScreenTouch
	var drag = event is InputEventScreenDrag
	var mouseButton = event is InputEventMouseButton
	var mouseMove = event is InputEventMouseMotion
	
	#print(event)
	if touch:
		return event.index
	
	elif drag:
		
		
		return event.index
	elif mouseButton or mouseMove:
		#plog("SOMETHING IS VERYWRONG??, I HAVE MOUSE ON TOUCH DEVICE")
		return INACTIVE_IDX
	else:
		return INACTIVE_IDX
		
func process_input(event):
	calculateForce(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y)

	var isReleased = isReleased(event)
	if isReleased:
		reset()
		
	get_tree().set_input_as_handled()


func reset():
	currentPointerIDX = INACTIVE_IDX
	##calculateForce(0, 0)
	last_pointer_position = Vector2()
	
func calculateForce(var x, var y):
	var v : Vector2 = Vector2(x, y)
	currentForce = last_pointer_position - v
	last_pointer_position = v
	
	sendSignal2Listener()

func sendSignal2Listener():
	if (listener != null):
#		listener.analog_force_change(currentForce, self)
		listener.queue_camera_rotation(currentForce)

func isPressed(event):
	if event is InputEventMouseMotion:
		return (InputEventMouse.button_mask == 1)
	elif event is InputEventScreenTouch:
		return event.is_pressed()

func isReleased(event):
	if event is InputEventScreenTouch:
		return !event.is_pressed()
	elif event is InputEventMouseButton:
		return !event.is_pressed()