extends Node2D
## Демо-уровень 1: Магнетизм.
## Задача: разместить магнит так, чтобы притянуть шарик к зелёной зоне.

var is_running: bool = false
var level_won: bool = false

@onready var magnet_node: Node2D = $GameField/Magnet
@onready var ball: RigidBody2D = $GameField/Ball
@onready var goal: Area2D = $GameField/Goal
@onready var run_button: Button = $UILayer/BottomBar/RunButton
@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)
	$UILayer/BottomBar/ResetButton.pressed.connect(func(): get_tree().reload_current_scene())
	$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())

	ball.freeze = true  # Шарик не двигается до запуска
	goal.body_entered.connect(_on_goal_reached)


func _physics_process(_delta: float) -> void:
	if not is_running or level_won:
		return

	# Магнит притягивает шарик
	var direction := magnet_node.global_position - ball.global_position
	var distance := direction.length()
	if distance > 10.0:
		var strength := 80000.0
		var force := direction.normalized() * strength / (distance * distance)
		ball.apply_central_force(force)


func _on_run() -> void:
	if is_running:
		return
	is_running = true
	run_button.disabled = true
	run_button.text = "▶ Работает..."
	ball.freeze = false  # Разморозить шарик
	# Блокировать перемещение магнита
	if magnet_node.has_method("set") and magnet_node.get("drag_enabled") != null:
		magnet_node.drag_enabled = false


func _on_goal_reached(body: Node2D) -> void:
	if body == ball and not level_won:
		level_won = true
		$GameField/Goal/Sprite.modulate = Color(0.3, 1.0, 0.3)  # Зелёный — цель достигнута!
		_show_win()


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()
