extends Control
class_name DialogueBox

signal end
signal update

export (NodePath) var name_label_path
onready var name_label = get_node(name_label_path) as RichTextLabel

export (NodePath) var text_label_path
onready var text_label = get_node(text_label_path) as RichTextLabel

export (NodePath) var expression_node_path
onready var expression_node = get_node(expression_node_path) as RichTextLabel

onready var music_player = get_node('/root/MusicPlayer') as MusicPlayer

var dialogue : Array
var index : int

var character_name : String = ""
var text : String = ""
var expression : String = ""
var waiting = false
var auto_advance = false

func _ready():
	assert(name_label != null)
	assert(text_label != null)
	assert(music_player != null)

func start(_dialogue : Array):
	dialogue = _dialogue
	index = 0
	update()

func _input(event):
	if !waiting and event.is_action_pressed("ui_accept"):
		if text_label.visible_characters < text_label.text.length():
			text_label.visible_characters = text_label.text.length()
		else:
			next()

func next() -> void:
	index += 1
	if index >= dialogue.size():
		hide()
		emit_signal('end')
		return
	update()

func update() -> void:
	var line = dialogue[index]
	
	# Self properties
	character_name = line.get('name', '')
	text = line.get('text', '')
	expression = line.get('expression', '')
	
	# Flow
	waiting = line.get('wait', false)
	auto_advance = line.get('auto', false)
	
	# Timer
	var timer = line.get('timer', 0)
	if timer > 0:
		waiting = true
	
	# Audio
	var audio = line.get('audio', null)
	if audio != null:
		if audio == '':
			music_player.fade_out()
		else:
			music_player.play(audio)
	
	# UI
	name_label.bbcode_text = character_name
	name_label.rect_min_size.x = name_label.get_font('normal_font').get_string_size(name_label.text).x
	text_label.bbcode_text = text
	
	if text == "":
		hide()
	else:
		show()
	
	emit_signal('update')
	
	animate_text()
	
	if timer > 0:
		yield(get_tree().create_timer(timer), 'timeout')
		stop_waiting()

func animate_text():
	var animated = index
	text_label.visible_characters = 0
	while animated == index && text_label.visible_characters < text_label.text.length():
		if text_label.text[text_label.visible_characters] == ' ':
			text_label.visible_characters += 1
		text_label.visible_characters += 1
		yield(get_tree().create_timer(0.05), 'timeout')

func stop_waiting():
	waiting = false
	if auto_advance:
		next()
