extends Node
class_name Announcer

@onready var announcer_audio_player: AudioStreamPlayer = $"AnnouncerAudioPlayer"
@onready var animation: AnimationPlayer = $"../AnimationPlayer"

@export_group("Announcer", "announcer")
@export_subgroup("Text", "announcer_text")
@export var announcer_text_wpm: float = 150.0
@export var announcer_text_linger_ratio: float = 1.0

@export_subgroup("Lines", "announcer_lines")
@export var announcer_lines_intro: Array[AnnouncerLine] = []
@export var announcer_lines_start_game: Array[AnnouncerLine] = []
@export var announcer_lines_waiting_for_players: Array[AnnouncerLine] = []
@export var announcer_lines_team_handout_pre: Array[AnnouncerLine] = []
@export var announcer_lines_team_handout_post: Array[AnnouncerLine] = []
@export var announcer_lines_role_handout_pre: Array[AnnouncerLine] = []
@export var announcer_lines_role_handout_post: Array[AnnouncerLine] = []

signal finished()

func _ready() -> void:
	announcer_audio_player.connect("finished", func(): finished.emit())
	
func announce_line_by_id(id: String, context: Dictionary = {}) -> void:
	var lines: Array[AnnouncerLine] = []
	lines.assign(get_indexed(NodePath("announcer_lines_" + id)))
	if !lines.is_empty():
		announce_line(lines.pick_random(), context)

func announce_text(text: String, context: Dictionary = {}) -> void:
	var line: AnnouncerLine = AnnouncerLine.new()
	line.text = text
	await announce_line(line, context)
	
func announce_random_line(lines: Array[AnnouncerLine], context: Dictionary = {}) -> void:
	await announce_line(lines.pick_random(), context)

func announce_line(line: AnnouncerLine, context: Dictionary = {}) -> void:
	if line == null:
		return
	$"../SubtitlesLabel".text = line.text.format(context)
	animation.play("subtitles_appear")
	await animation.animation_finished
	var duration: float = 1.0
	if line.audio == null:
		line.audio = await $"../TTS".get_tts_audio(line.text.format(context))
	
	if line.audio != null:
		duration = line.audio.get_length()
		announcer_audio_player.stream = line.audio
		announcer_audio_player.play(0.0)
	else:
		var word_count = line.text.count(" ")+1
		duration = word_count * (60.0/150.0)
	animation.play("subtitles_display", -1, 1.0/duration)
	await animation.animation_finished
	var linger_time: float = duration * announcer_text_linger_ratio
	await get_tree().create_timer(linger_time).timeout
	animation.play("subtitles_disappear")
	await animation.animation_finished

func is_speaking():
	return announcer_audio_player.playing