class_name CircuitElement
extends Node2D
## Базовый класс для всех элементов электрической цепи.

## Название элемента (для UI)
@export var element_name: String = "Элемент"

## Размер клетки сетки
@export var grid_size: int = 64

## Нельзя перемещать
@export var is_fixed: bool = false

## Позиция на сетке
var grid_pos: Vector2i = Vector2i.ZERO

## Точки подключения (относительные позиции в клетках)
## Например, [Vector2i(-1, 0), Vector2i(1, 0)] — слева и справа
var connection_points: Array[Vector2i] = []

## Подключённые элементы (ссылки)
var connected_to: Array[CircuitElement] = []

## Получает ли элемент питание
var is_powered: bool = false

## Drag-and-drop
var dragging: bool = false
var drag_offset: Vector2 = Vector2.ZERO


func _input(event: InputEvent) -> void:
	if is_fixed:
		return

	if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
		if event.pressed and _is_mouse_over():
			dragging = true
			drag_offset = global_position - event.position
			z_index = 10
		elif not event.pressed and dragging:
			dragging = false
			snap_to_grid()
			z_index = 0

	if event is InputEventMouseMotion and dragging:
		global_position = event.position + drag_offset


func snap_to_grid() -> void:
	grid_pos = Vector2i(
		roundi(position.x / grid_size),
		roundi(position.y / grid_size)
	)
	position = Vector2(grid_pos) * grid_size


## Получить абсолютные позиции точек подключения (в клетках сетки)
func get_absolute_connection_points() -> Array[Vector2i]:
	var result: Array[Vector2i] = []
	for p in connection_points:
		result.append(grid_pos + p)
	return result


## Обновить визуальное состояние (запитан / не запитан)
func update_visual() -> void:
	if is_powered:
		modulate = Color(1.0, 1.0, 0.5)  # Жёлтый оттенок
	else:
		modulate = Color.WHITE


func _is_mouse_over() -> bool:
	var mouse_pos := get_global_mouse_position()
	var rect := Rect2(
		global_position - Vector2(grid_size, grid_size) / 2,
		Vector2(grid_size, grid_size)
	)
	return rect.has_point(mouse_pos)
