@icon("res://components/Cursor/mouse-pointer-2.svg")
extends Base

@onready var mouse_control = $"MouseControl"
@onready var sprite_2d: Sprite2D = $MouseControl/Sprite2D

const CURSOR_UI = preload("res://components/Cursor/cursor-ui.png")
const CURSOR = preload("res://components/Cursor/cursor.png")
var cursor_state = "normal"
var rotation_tween

var cursor_tween

func _ready() -> void:
	Persister.data_persisted.connect(_on_data_persisted)
	


func _on_fire(_data):
	if cursor_state == "ui":
		return
	


func _on_release():
	var overlapping_areas = mouse_control.get_overlapping_areas()
	overlapping_areas.sort_custom(func(a, b):
		return a.z_index > b.z_index
	)
	
	for area in overlapping_areas:
		if area.has_method("_on_released"):
			var current_node = area
			var hidden = false
			while current_node:
				if "modulate" in current_node:
					if current_node.modulate.a < 1:
						hidden = true
						break
				current_node = current_node.get_parent()
			
			if hidden:
				continue
			
			if not area._on_released():
				break


func _on_click():
	var overlapping_areas = mouse_control.get_overlapping_areas()
	overlapping_areas.sort_custom(func(a, b):
		return a.z_index > b.z_index
	)
	
	for area in overlapping_areas:
		if area.has_method("_on_clicked"):
			var current_node = area
			var hidden = false
			while current_node:
				if "modulate" in current_node:
					if current_node.modulate.a < 1:
						hidden = true
						break
				if "visible" in current_node:
					if not current_node.visible:
						hidden = true
						break
				current_node = current_node.get_parent()
			
			if hidden:
				continue
			
			if not area._on_clicked():
				break

func _on_rclick():
	var overlapping_areas = mouse_control.get_overlapping_areas()
	overlapping_areas.sort_custom(func(a, b):
		return a.z_index > b.z_index
	)
	
	for area in overlapping_areas:
		if area.has_method("_on_rclicked"):
			var current_node = area
			var hidden = false
			while current_node:
				if "modulate" in current_node:
					if current_node.modulate.a < 1:
						hidden = true
						break
				if "visible" in current_node:
					if not current_node.visible:
						hidden = true
						break
				current_node = current_node.get_parent()
			
			if hidden:
				continue
			
			if not area._on_rclicked():
				break


func _process(delta):
	if Input.is_action_just_released("lclick"):
		_on_release()
	if Input.is_action_just_pressed("lclick"):
		_on_click()
	if Input.is_action_just_pressed("rclick"):
		_on_rclick()
	Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
	mouse_control.position = mouse_control.get_global_mouse_position()
	
	if not Input.is_action_pressed("lclick"):
		sprite_2d.rotation = move_toward(sprite_2d.rotation, 0, delta)
		sprite_2d.scale = sprite_2d.scale.move_toward(Vector2.ONE, delta)
	else:
		sprite_2d.scale = sprite_2d.scale.move_toward(Vector2.ONE * 0.9, delta * 2)
		sprite_2d.rotation = move_toward(sprite_2d.rotation, -0.1, delta * 2)

func _on_mouse_control_area_entered(area):
	if area.has_method("_on_hovered"):
		var current_node = area
		var hidden = false
		while current_node:
			if "visible" in current_node:
				if not current_node.visible:
					hidden = true
					break
			current_node = current_node.get_parent()
		
		if not hidden:
			area._on_hovered()


func _on_mouse_control_area_exited(area):
	if area.has_method("_on_unhovered"):
		var current_node = area
		var hidden = false
		while current_node:
			if "visible" in current_node:
				if not current_node.visible:
					hidden = true
					break
			current_node = current_node.get_parent()
		
		if not hidden:
			area._on_unhovered()