extends Node2D
## Демо-уровень 1: Электрические цепи.
## Задача: соединить батарею с лампочкой, замкнув цепь проводом.

var is_running: bool = false

@onready var power: Node2D = $GameField/PowerSource
@onready var consumer_node: Node2D = $GameField/Consumer
@onready var wire: Node2D = $GameField/Wire
@onready var wire_line: Line2D = $GameField/WireLine
@onready var run_button: Button = $UILayer/BottomBar/RunButton
@onready var reset_button: Button = $UILayer/BottomBar/ResetButton
@onready var win_panel: PanelContainer = $UILayer/WinPanel


func _ready() -> void:
	$UILayer/TopBar/LevelLabel.text = "Уровень %d" % GameManager.current_level
	$UILayer/TopBar/HintLabel.text = "Перетащите провод между батареей и лампочкой"
	win_panel.visible = false

	run_button.pressed.connect(_on_run)
	reset_button.pressed.connect(_on_reset)
	$UILayer/TopBar/BackButton.pressed.connect(func(): GameManager.go_to_level_select())
	$UILayer/WinPanel/VBoxContainer/NextButton.pressed.connect(_on_next)
	$UILayer/WinPanel/VBoxContainer/MenuButton.pressed.connect(func(): GameManager.go_to_level_select())


func _process(_delta: float) -> void:
	# Визуализировать провод от батареи через промежуточную точку (wire) к лампочке
	if wire_line:
		wire_line.default_color = Color.YELLOW if is_running and _check_circuit() else Color.GRAY
		wire_line.width = 3.0 if is_running and _check_circuit() else 2.0
		wire_line.points = PackedVector2Array([
			power.global_position + Vector2(0, 30),
			wire.global_position,
			consumer_node.global_position + Vector2(0, 30)
		])

	# Обновить визуал лампочки (Sprite2D — используем modulate)
	if is_running and _check_circuit():
		$GameField/Consumer/Sprite.modulate = Color(1.0, 1.0, 0.5)  # Горит — жёлтый
	else:
		$GameField/Consumer/Sprite.modulate = Color(0.5, 0.5, 0.5)  # Не горит — тусклый


## Проверить, замкнута ли цепь (провод между батареей и лампочкой)
func _check_circuit() -> bool:
	# Простая проверка: провод находится между батареей и лампочкой по X
	var wire_x := wire.global_position.x
	var power_x := power.global_position.x
	var consumer_x := consumer_node.global_position.x
	var min_x := minf(power_x, consumer_x)
	var max_x := maxf(power_x, consumer_x)

	# Провод должен быть между ними и на правильной высоте
	var wire_y := wire.global_position.y
	var target_y := power.global_position.y + 30
	return wire_x > min_x - 32 and wire_x < max_x + 32 and abs(wire_y - target_y) < 64


func _on_run() -> void:
	is_running = true
	run_button.disabled = true
	run_button.text = "▶ Работает..."

	if _check_circuit():
		# Цепь замкнута — победа через 1 секунду
		await get_tree().create_timer(1.0).timeout
		_show_win()
	else:
		# Цепь разомкнута
		$UILayer/TopBar/HintLabel.text = "Цепь не замкнута! Переместите провод и попробуйте снова."
		is_running = false
		run_button.disabled = false
		run_button.text = "▶ Запуск"


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


func _show_win() -> void:
	win_panel.visible = true
	win_panel.modulate.a = 0.0
	var tween := create_tween()
	tween.tween_property(win_panel, "modulate:a", 1.0, 0.5)
	GameManager.complete_level(GameManager.current_level)


func _on_next() -> void:
	var next := GameManager.current_level + 1
	if next <= GameManager.total_levels:
		GameManager.go_to_level(next)
	else:
		GameManager.go_to_level_select()
