class_name SFXSet
extends Resource

@export var sounds: Array[AudioStream]
@export var apply_attenuation_settings: bool = true
@export var attenuation_model: AudioStreamPlayer3D.AttenuationModel = AudioStreamPlayer3D.AttenuationModel.ATTENUATION_LOGARITHMIC
@export_range(0.01, 10.0) var unit_size: float = 0.5
@export var max_distance: float = 1.5
@export var apply_volume_settings: bool = true
@export_range(-80.0, 80.0) var volume: float = -1.0
@export_range(-24, 6.0) var max_db: float = -1.0
@export var apply_pitch_settings: bool = true
@export_range(0.01, 4.0) var pitch_min: float = 0.9
@export_range(0.01, 4.0) var pitch_max: float = 1.1
@export var apply_limit_settings: bool = true
@export_range(1, 16) var limit_play_instances: int = 4
@export_range(0.01, 100.0) var limit_play_freqency: float = 0.1
var play_times: Array[float] = []


func apply(sp: SFXPlayer3D) -> void:
	sp.stream = sounds[randi_range(0, sounds.size()-1)]
	if apply_attenuation_settings:
		sp.attenuation_model = attenuation_model
		sp.unit_size = unit_size
		sp.max_distance = max_distance
	if apply_volume_settings:
		sp.volume_db = volume
		sp.max_db = max_db
	if apply_pitch_settings:
		sp.pitch_scale = randf_range(pitch_min, pitch_max)


func mark_played() -> void:
	if apply_limit_settings:
		play_times.append(Time.get_unix_time_from_system())


func can_play() -> bool:
	if apply_limit_settings:
		var t: float = Time.get_unix_time_from_system()
		for i: int in range(play_times.size() - 1, -1, -1): # need to iterate backwards
			if absf(t - play_times[i]) > limit_play_freqency:
				play_times.remove_at(i)
		return play_times.size() < limit_play_instances
	else:
		return true
