extends Node2D

var _timer = 0.0
var _level_running = true
var _next_level = ""

var _level_node = null

func get_hours():
	return floor(_timer / 3600.0)

func get_minutes():
	return floor(fmod((_timer / 60), 60.0))

func get_seconds():
	return floor(fmod(_timer, 60.0))


func load_and_play_music(src):
	if src != "":
		var fn = "res://Data/Sound/Music/" + src
		if File.new().file_exists(fn):
			$Music.stream = load(fn)
			$Music.play()

func load_level(src):
	$Music.stop()
	_level_running = false
	get_node("Player").hide()
	var lvl = get_node("lvl")
	if _level_node != null:
		lvl.disconnect("exit_level", self, "_on_exit_level")
		lvl.remove_child(_level_node)
		_level_node.call_deferred("free")
		_level_node = null
	var lvlres = load("res://Data/Scenes/Levels/" + src)
	if lvlres:
		_level_node = lvlres.instance()
		lvl.add_child(_level_node)
		_level_node.connect("exit_level", self, "_on_exit_level")
		load_and_play_music(_level_node.get_level_music())
		reset()
		if _level_node.is_main_menu():
			$GUI/PlayerUI.hide()
			$GUI/Timer.hide()
		else:
			$GUI/PlayerUI.show()
			$GUI/Timer.show()
			_level_running = true


func reset():
	if _level_node:
		get_tree().paused = true
		var p = get_node("Player")
		if _level_node.has_method("get_starting_position"):
			p.position = _level_node.get_starting_position()
		else:
			p.position = Vector2.ZERO
		p.reset()
		if _level_node.is_main_menu():
			p.mode = RigidBody2D.MODE_KINEMATIC
		else:
			p.mode = RigidBody2D.MODE_RIGID
			p.show()
		_timer = 0.0
		get_tree().paused = false

func pause(enable = true):
	if get_tree().paused != enable:
		_level_running = !enable
		get_tree().paused = enable


func _ready():
	set_physics_process(true)
	load_level("MainMenuLogo.tscn")

func _animate_level_exit(exit):
	$Player.mode = RigidBody2D.MODE_KINEMATIC
	$ExitTween.interpolate_property($Player, "position", $Player.position, exit.position, 2.0, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
	$ExitTween.start()

func _physics_process(delta):
	if _level_running:
		_timer += delta


func _on_PM_Quit_pressed():
	get_tree().quit()

func _on_exit_level(exit, body, next_level):
	if next_level != "":
		_next_level = next_level
		if exit != null:
			_animate_level_exit(exit)
		else:
			load_level(next_level)


func _on_ExitTween_tween_all_completed():
	$Player.mode = RigidBody2D.MODE_RIGID
	if _next_level != "":
		load_level(_next_level)