class_name WaveReceiver
extends GameElement
## Приёмник волн.
## Активируется, когда пиковая амплитуда в его позиции превышает порог
## на протяжении заданного времени.

## Пороговая амплитуда для активации
@export var threshold: float = 30.0

## Время (в секундах), которое пиковая амплитуда должна превышать порог
@export var activation_time: float = 0.8

## Сигнал при активации приёмника
signal activated

## Текущее состояние
var is_activated: bool = false

## Таймер удержания пиковой амплитуды выше порога
var sustained_time: float = 0.0

## Текущая измеренная амплитуда (мгновенная, устанавливается извне)
var current_amplitude: float = 0.0

## Пиковая амплитуда за последний период (для корректного сравнения с порогом)
var _peak_amplitude: float = 0.0

## Таймер для сброса пиковой амплитуды (скользящее окно ~1 с)
var _peak_window: float = 0.0
const PEAK_WINDOW_DURATION: float = 0.8


func _ready() -> void:
	element_name = "Приёмник"


func _process(delta: float) -> void:
	if is_activated:
		return

	# Обновляем пиковую амплитуду: запоминаем максимум |amplitude| за окно
	var abs_amp := absf(current_amplitude)
	if abs_amp > _peak_amplitude:
		_peak_amplitude = abs_amp
		_peak_window = 0.0  # сбросить таймер окна при новом пике

	# Скользящее окно: если за PEAK_WINDOW_DURATION не было нового пика — сбросить
	_peak_window += delta
	if _peak_window >= PEAK_WINDOW_DURATION:
		_peak_amplitude = abs_amp  # начать отсчёт заново
		_peak_window = 0.0

	# Проверяем пиковую амплитуду против порога
	if _peak_amplitude >= threshold:
		sustained_time += delta
		if sustained_time >= activation_time:
			_activate()
	else:
		sustained_time = 0.0

	# Визуальная обратная связь: яркость зависит от пиковой амплитуды
	var intensity := clampf(_peak_amplitude / threshold, 0.0, 1.0)
	modulate = Color(1.0, 1.0 - intensity * 0.5, 1.0 - intensity * 0.5)


## Вычислить суммарную амплитуду от всех источников в уровне
func _calculate_total_amplitude() -> float:
	var total := 0.0
	var sources := get_tree().get_nodes_in_group("wave_sources")
	for source in sources:
		if source is WaveSource and source.is_active:
			var distance := global_position.distance_to(source.global_position)
			total += source.get_amplitude_at(distance)
	return total


func _activate() -> void:
	is_activated = true
	modulate = Color.GREEN
	activated.emit()
	print("Приёмник активирован!")


## Сброс состояния
func reset() -> void:
	is_activated = false
	sustained_time = 0.0
	current_amplitude = 0.0
	_peak_amplitude = 0.0
	_peak_window = 0.0
	modulate = Color.WHITE
