extends Node2D
## Менеджер уровня для кейса "Волны и колебания".
## Управляет запуском симуляции и проверкой условий победы.

## Номер текущего уровня
@export var level_number: int = 1

## Текст подсказки
@export var hint_text: String = "Разместите объекты и нажмите Запуск"

## Симуляция запущена
var is_running: bool = false

## Ссылки на ключевые узлы
@onready var game_field := $GameField
@onready var ui_layer := $UILayer


func _ready() -> void:
	level_number = GameManager.current_level
	$UILayer/TopBar/LevelLabel.text = "Уровень %d" % level_number
	$UILayer/TopBar/HintLabel.text = hint_text
	$UILayer/WinPanel.visible = false

	# Подключение кнопок
	$UILayer/TopBar/BackButton.pressed.connect(_on_back)
	$UILayer/BottomBar/RunButton.pressed.connect(_on_run)
	$UILayer/BottomBar/ResetButton.pressed.connect(_on_reset)
	$UILayer/WinPanel/VBoxContainer/NextButton.pressed.connect(_on_next)
	$UILayer/WinPanel/VBoxContainer/MenuButton.pressed.connect(_on_menu)

	# Подключить сигналы приёмников
	for receiver in get_tree().get_nodes_in_group("receivers"):
		if receiver is WaveReceiver:
			receiver.activated.connect(_on_receiver_activated)


func _on_back() -> void:
	GameManager.go_to_level_select()


func _on_run() -> void:
	if is_running:
		return
	is_running = true
	$UILayer/BottomBar/RunButton.text = "⏸ Пауза"

	# Блокировать перемещение элементов
	for element in get_tree().get_nodes_in_group("game_elements"):
		if element is GameElement:
			element.is_fixed = true

	# Активировать все источники
	for source in get_tree().get_nodes_in_group("wave_sources"):
		if source is WaveSource:
			source.activate()


func _on_reset() -> void:
	get_tree().reload_current_scene()


func _on_receiver_activated() -> void:
	# Проверяем, все ли приёмники активированы
	var all_activated := true
	for receiver in get_tree().get_nodes_in_group("receivers"):
		if receiver is WaveReceiver and not receiver.is_activated:
			all_activated = false
			break

	if all_activated:
		_show_win()


func _show_win() -> void:
	$UILayer/WinPanel.visible = true
	$UILayer/WinPanel.modulate.a = 0.0
	var tween := create_tween()
	tween.tween_property($UILayer/WinPanel, "modulate:a", 1.0, 0.5)
	GameManager.complete_level(level_number)


func _on_next() -> void:
	GameManager.go_to_level(level_number + 1)


func _on_menu() -> void:
	GameManager.go_to_level_select()
