class_name MusicPlayer
extends PanelContainer

# LOC 20/1-24: 136
# LOC 12/6-24: 170

@onready
var play_button: TextureButton = $MusicPlayerContainer/PlayTextureButton

@onready
var restart_button: TextureButton = $MusicPlayerContainer/RestartTextureButton

@onready
var audio_player: AudioStreamPlayer = $AudioStreamPlayer

@onready
var sound_player: AudioStreamPlayer = $AudioSoundPlayer

@onready
var sound_effect_player: AudioStreamPlayer = $AudioSoundEffectPlayer

@onready
var progress_slider: HSlider = $MusicPlayerContainer/MusicPlayerSlider

@onready
var volume_slider: HSlider = $MusicPlayerContainer/VolumeSlider

@onready
var music_time_label: Label = $MusicPlayerContainer/MusicTimeLabel

@onready
var path: String = '/Users/sebastian/ResilioSync/Sorterat_test/Metal Gear Solid 4 - Guns of the Patriots/2-16 Metal Gear Saga.mp3'

var play_icon: Texture = preload("res://icons/play_icon_light.svg")
var pause_icon: Texture = preload("res://icons/pause_icon_light.svg")

var songs: Array = []

var is_changing: bool = false
var playback_position: float
var stream: AudioStream
var song_finished: bool = false

signal update_song_list
signal play_next_song

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
	play_button.pressed.connect(play_or_pause)
	restart_button.pressed.connect(restart)
	progress_slider.drag_started.connect(_on_drag_started)
	progress_slider.drag_ended.connect(_on_drag_ended)
	
	audio_player.finished.connect(_on_finished)

func _process(_delta: float) -> void:
	if audio_player.has_stream_playback() && !is_changing && !audio_player.stream_paused:
		progress_slider.value = audio_player.get_playback_position()
		if stream != null:
			music_time_label.text = format_text(progress_slider.value, stream.get_length())
		else:
			music_time_label.text = format_text(progress_slider.value, 0.0)

func format_time(time: float) -> String:
	var mins: String = "%02d" % floor(time / 60)
	var sec: String = "%02d" % round(fmod(time, 60))
	return  mins + ":" + sec

func format_text(part: float, total: float) -> String:	
	return format_time(part) + " / " + format_time(total)

func play_or_pause() -> void:
	if song_finished:
		restart()
	elif audio_player.stream_paused:
		play_button.texture_normal = pause_icon
		audio_player.stream_paused = false
		song_finished = false
		audio_player.seek(playback_position)
		print("continue")
		progress_slider.max_value = round(stream.get_length())
		progress_slider.tick_count = round(stream.get_length() / 60)
	else:
		pause()

func pause() -> void:
	audio_player.stream_paused = true
	playback_position = audio_player.get_playback_position()
	play_button.texture_normal = play_icon

func restart() -> void:
	audio_player.stop()
	audio_player.stream_paused = false
	song_finished = false
	progress_slider.value = 0
	playback_position = audio_player.get_playback_position()
	audio_player.seek(playback_position)
	play_button.texture_normal = pause_icon
	audio_player.play()
	
func _on_finished() -> void:
	play_button.texture_normal = play_icon
	song_finished = true
	if !Settings.stop_after_current:
		play_next_song.emit()
	if Settings.auto_repeat_song:
		restart()
	
func _on_drag_started() -> void:
	is_changing = true

func _on_drag_ended(_changed: bool) -> void:
	audio_player.seek(progress_slider.value)
	playback_position = progress_slider.value
	is_changing = false

func seek(new_position: float) -> void:
	progress_slider.value += new_position
	is_changing = true
	audio_player.seek(progress_slider.value)
	playback_position = progress_slider.value
	is_changing = false
	
func change_volume(value: float) -> void:
	volume_slider.value += value
	volume_slider.change_volume(volume_slider.value)

func _on_point_triggered(point: String) -> void:
	if point == "first":
		var value: int = randi_range(0, 10)
		if value == 0:
			play_sound(preload("res://sounds/sound1.mp3"))
		elif value < 5:
			play_sound(preload("res://sounds/intro_long.mp3"))
		else:
			play_sound(preload("res://sounds/intro_short.mp3"))
	elif point == "match":
		play_sound(preload("res://sounds/sound0.mp3"))
	
func play_sound_effect(sound_effect_name: AudioStream) -> void:
	sound_effect_player.stream = sound_effect_name
	sound_effect_player.play()

func play_sound(sound_name: AudioStream) -> void:
	sound_player.stream = sound_name
	audio_player.stop()
	sound_player.play()
	song_finished = true
	play_button.texture_normal = play_icon
	progress_slider.value = 0
	if stream != null:
		music_time_label.text = format_text(progress_slider.value, stream.get_length())
	
func play_song(body: PackedByteArray) -> void:
	var sound: AudioStream = AudioStreamMP3.new()
	sound.data = body
	audio_player.stream = sound
	audio_player.play()
	sound_player.stop()
	song_finished = false
	play_button.texture_normal = pause_icon
	stream = audio_player.stream
	progress_slider.max_value = round(stream.get_length())
	progress_slider.tick_count = round(stream.get_length() / 60)

func play_song_object(song_object_no: int) -> void:
	print("play_song_object")
	if audio_player.is_playing():
		audio_player.stop()
		await get_tree().create_timer(0.5).timeout
	audio_player.stream = Playlist.get_song(song_object_no)
	sound_player.stop()
	audio_player.play()
	song_finished = false
	play_button.texture_normal = pause_icon
	stream = audio_player.stream
	progress_slider.max_value = round(stream.get_length())
	progress_slider.tick_count = round(stream.get_length() / 60)
	Playlist.set_currently_playing_song(song_object_no)
	Playlist.unset_is_playing()
	if !Settings.hide_next_track:
		print("Show answer now!!")
		Playlist.song_is_answered(song_object_no)
	Playlist.song_has_played(song_object_no)
	Playlist.song_is_playing(song_object_no)
	update_song_list.emit()

func get_sound_test_song() -> void:
	Settings.make_request2("/music/soundTest", play_song, true)

#####    LOCAL
var local_path: String = '/Users/sebastian/ResilioSync/Sorterat_test/Metal Gear Solid 4 - Guns of the Patriots/2-16 Metal Gear Saga.mp3'

func load_mp3(_path: String) -> AudioStream:
	var file: FileAccess = FileAccess.open(_path, FileAccess.READ)
	var sound: AudioStream = AudioStreamMP3.new()
	sound.data = file.get_buffer(file.get_length())
	return sound

func play_local_song() -> void:
	if songs:
		local_path = songs[0]
		print(local_path)
		print(FileAccess.file_exists(local_path))
		play_sound(load_mp3(local_path))

func sound_test_local() -> void:
	play_sound(preload("res://sounds/01. Opening.mp3"))
