class_name WaveSource
extends GameElement
## Источник колебаний.
## Генерирует синусоидальную волну с заданными параметрами.

## Амплитуда колебаний (максимальное отклонение)
@export var amplitude: float = 50.0

## Частота колебаний (в герцах)
@export var frequency: float = 1.5

## Скорость распространения волны (пикселей в секунду)
@export var wave_speed: float = 200.0

## Длина видимой волны (в пикселях)
@export var wave_length: float = 400.0

## Цвет волны
@export var wave_color: Color = Color(0.3, 0.6, 1.0, 0.8)

## Включён ли источник
var is_active: bool = false

## Внутренний счётчик времени
var time: float = 0.0

@onready var line := $Line2D


func _ready() -> void:
	element_name = "Источник колебаний"
	if line:
		line.default_color = wave_color
		line.width = 3.0


func _process(delta: float) -> void:
	if not is_active:
		if line:
			line.clear_points()
		return

	time += delta
	_draw_wave()


## Отрисовать волну с помощью Line2D
func _draw_wave() -> void:
	var points: PackedVector2Array = []
	var num_points := int(wave_length / 2.0)

	for i in range(num_points):
		var x := float(i) * 2.0
		# Формула бегущей волны: y = A * sin(2π*f*t - 2π*x/λ)
		var phase := 2.0 * PI * frequency * time - 2.0 * PI * x / wave_length
		var y := amplitude * sin(phase)
		points.append(Vector2(x, y))

	if line:
		line.points = points


## Получить амплитуду волны в указанной точке (расстояние от источника)
func get_amplitude_at(distance: float) -> float:
	if not is_active or distance <= 0:
		return 0.0
	# Амплитуда убывает с расстоянием (затухание)
	var damping := 1.0 / (1.0 + distance / 500.0)
	var phase := 2.0 * PI * frequency * time - 2.0 * PI * distance / wave_length
	return amplitude * damping * sin(phase)


## Включить/выключить источник
func activate() -> void:
	is_active = true
	time = 0.0


func deactivate() -> void:
	is_active = false
