class_name MagneticShield
extends StaticBody2D
## Магнитный экран. Блокирует магнитное поле.
## Магниты за экраном не действуют на объекты перед ним.

## Размер экрана
@export var shield_size: Vector2 = Vector2(10, 128)

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

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

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


func _ready() -> void:
	add_to_group("shields")
	modulate = Color(0.3, 0.3, 0.3)  # Тёмно-серый


## Проверить, блокирует ли экран линию между двумя точками
func blocks_field(from_pos: Vector2, to_pos: Vector2) -> bool:
	# Простая проверка: если отрезок (from → to) пересекает прямоугольник экрана
	var rect := Rect2(
		global_position - shield_size / 2,
		shield_size
	)
	# Проверяем пересечение отрезка с прямоугольником (упрощённо)
	return rect.has_point(from_pos.lerp(to_pos, 0.5))


# --- Drag-and-drop ---

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:
	position = Vector2(
		round(position.x / grid_size) * grid_size,
		round(position.y / grid_size) * grid_size
	)


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