extends Base

var used_lines = []
var mouse_over = false

@onready var text_box = $"TextBox"
@onready var text_box_text = $"TextBox/Graphics/TextBoxText"
@onready var text_box_name = $"TextBox/Graphics/TextBoxName"
@onready var text_box_image = $"TextBox/Graphics/TextBoxAvatar"
@onready var minimize_handler = $"TextBox/MinimizeHandler"

var pop_tween
var last_lines = {}

func _spawned():
	text_box.modulate = Color.TRANSPARENT
	text_box.scale = Vector2(0, 0)
	text_box.position.y = 360
	
	minimize_handler.clicked.connect(_on_clicked)
	
	if _triggerer:
		_triggerer.listen("any", _on_trigger)


func _on_trigger(data: Dictionary) -> void:
	if has_trigger(data.trigger):
		trigger_dialogue(data.trigger)


func _on_clicked():
	if pop_tween:
		pop_tween.kill()
	
	pop_tween = create_tween()
	pop_tween.set_ease(Tween.EASE_IN)
	pop_tween.set_trans(Tween.TRANS_BACK)
	pop_tween.set_parallel()
	pop_tween.tween_property(text_box, "modulate", Color.TRANSPARENT, 0.5)
	pop_tween.tween_property(text_box, "scale", Vector2(0, 0), 0.5)
	pop_tween.tween_property(text_box, "position:y", 360, 0.5)
	pop_tween.chain()

func get_priority_from_string(string: String):
	match string:
		"low": return 1
		"medium": return 2
		"high": return 3

func trigger_dialogue(trigger: String):
	_info("Dialogue trigger %s triggered" % [trigger])
	var dialogue = get_dialogue(trigger)
	
	if not dialogue:
		return
	
	var lines = dialogue.values()
	
	
	
	
	if pop_tween:
		pop_tween.kill()
	
	#var person = Data.data.people[lines[0].character]
	
	text_box_text.text = lines[0].text
	#text_box_image.texture = Data.data.images[lines[0].character]
	#text_box_name.text = "[center]%s" % [person.short]
	
	pop_tween = create_tween()
	pop_tween.set_ease(Tween.EASE_OUT)
	pop_tween.set_trans(Tween.TRANS_BACK)
	pop_tween.set_parallel()
	pop_tween.tween_property(text_box, "modulate", Color.WHITE, 0.5)
	pop_tween.tween_property(text_box, "scale", Vector2(1, 1), 0.5)
	pop_tween.tween_property(text_box, "position:y", 280, 0.5)
	pop_tween.chain()
	
	#get_parent().move_child(self, get_parent().get_child_count() - 1)
	

func has_trigger(trigger: String):
	var dialogue_files = Data.data.dialogue.values()
	
	for file in dialogue_files:
		for key in file:
			if file[key].has("trigger"):
				if file[key].trigger == trigger:
					return true
	
	return false


func get_dialogue(trigger: String):
	var dialogue_files = Data.data.dialogue.values()
	
	var combined_object = {}
	
	for file in dialogue_files:
		for key in file:
			combined_object[key] = file[key]
			combined_object[key].key = key
	
	var lines = combined_object.values()
	var trigger_lines = lines.filter(func(x): return x.trigger == trigger)
	
	trigger_lines.sort_custom(func(a, b):
		var apriority = a.rules.priority if a.rules.has("priority") else "medium"
		var bpriority = b.rules.priority if b.rules.has("priority") else "medium"
		
		if get_priority_from_string(apriority) == get_priority_from_string(bpriority):
			return randf() < 0.5
		
		return get_priority_from_string(apriority) > get_priority_from_string(bpriority)
	)
	
	for line in trigger_lines:
		var invalid = false
		
		if last_lines.has(line.trigger) and last_lines[line.trigger] == line.key:
			invalid = true
		
		for rule in line.rules:
			if rule == "priority":
				continue
			elif rule == "unique":
				if used_lines.has(line.key):
					invalid = true
					break
			else:
				var value = Persister.get_value(rule)
				if value != line.rules[rule]:
					invalid = true
					break
		
		if invalid:
			continue
		
		last_lines[line.trigger] = line.key
		used_lines.push_back(line.key)
		return line.lines
	
	return null