@tool
extends Control

enum { MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM, MARGIN_CENTER }

const DRAW_NOTHING := -1
const DRAW_CENTERED := -2
const MARGIN_NONE := -1

var _draw_margin := DRAW_NOTHING
var _should_split := false


func _notification(what: int) -> void:
	if what == NOTIFICATION_MOUSE_EXIT:
		_draw_margin = DRAW_NOTHING
		queue_redraw()
	elif what == NOTIFICATION_MOUSE_ENTER and not _should_split:
		_draw_margin = DRAW_CENTERED
		queue_redraw()


func _gui_input(event: InputEvent) -> void:
	if _should_split and event is InputEventMouseMotion:
		_draw_margin = _find_hover_margin(event.position)
		queue_redraw()


func _draw() -> void:
	var rect: Rect2
	if _draw_margin == DRAW_NOTHING:
		return
	elif _draw_margin == DRAW_CENTERED:
		rect = Rect2(Vector2.ZERO, size)
	elif _draw_margin == MARGIN_LEFT:
		rect = Rect2(0, 0, size.x * 0.5, size.y)
	elif _draw_margin == MARGIN_TOP:
		rect = Rect2(0, 0, size.x, size.y * 0.5)
	elif _draw_margin == MARGIN_RIGHT:
		var half_width = size.x * 0.5
		rect = Rect2(half_width, 0, half_width, size.y)
	elif _draw_margin == MARGIN_BOTTOM:
		var half_height = size.y * 0.5
		rect = Rect2(0, half_height, size.x, half_height)
	var stylebox := get_theme_stylebox("panel", "TooltipPanel")
	draw_style_box(stylebox, rect)


func set_enabled(enabled: bool, should_split: bool = true) -> void:
	visible = enabled
	_should_split = should_split
	if enabled:
		_draw_margin = DRAW_NOTHING
		queue_redraw()


func get_hover_margin() -> int:
	return _draw_margin


func _find_hover_margin(point: Vector2) -> int:
	var half_size := size * 0.5

	var left := point.distance_squared_to(Vector2(0, half_size.y))
	var lesser := left
	var lesser_margin := MARGIN_LEFT

	var top := point.distance_squared_to(Vector2(half_size.x, 0))
	if lesser > top:
		lesser = top
		lesser_margin = MARGIN_TOP

	var right := point.distance_squared_to(Vector2(size.x, half_size.y))
	if lesser > right:
		lesser = right
		lesser_margin = MARGIN_RIGHT

	var bottom := point.distance_squared_to(Vector2(half_size.x, size.y))
	if lesser > bottom:
		#lesser = bottom  # unused result
		lesser_margin = MARGIN_BOTTOM
	return lesser_margin