class_name GameSettingsType extends Node
## Container for project settings, for quick runtime access.

var version: String

var settings_file: String
var audio_bus_file: String

var free_camera_speed: float
var x_sensitivity: float
var y_sensitivity: float
var x_acceleration: float
var y_acceleration: float
var invert_pitch: bool

var enable_screen_shake: bool
var enable_hit_lag: bool

var projection_collisions: bool
var projection_gravity: bool

var default_text_speed: float

var default_physics_ticks_per_second: int


func _init() -> void:
	ProjectSettings.settings_changed.connect(_read_settings)
	_read_settings()
	_load_audio_bus_override()


func _read_settings() -> void:
	version = ProjectSettings.get_setting("application/config/version")

	settings_file = ProjectSettings.get_setting("application/config/project_settings_override")
	audio_bus_file = ProjectSettings.get_setting("game/audio/buses/override_bus_layout")

	free_camera_speed = ProjectSettings.get_setting("game/config/controls/camera/free_camera_speed")
	x_sensitivity = ProjectSettings.get_setting("game/config/controls/camera/x_axis_sensitivity")
	y_sensitivity = ProjectSettings.get_setting("game/config/controls/camera/y_axis_sensitivity")
	x_acceleration = ProjectSettings.get_setting("game/config/controls/camera/x_axis_acceleration")
	y_acceleration = ProjectSettings.get_setting("game/config/controls/camera/y_axis_acceleration")
	invert_pitch = ProjectSettings.get_setting("game/config/controls/camera/invert_pitch")

	enable_screen_shake = ProjectSettings.get_setting(
		"game/config/accessibility/enable_screen_shake"
	)
	enable_hit_lag = ProjectSettings.get_setting("game/config/accessibility/enable_hit_lag")

	projection_collisions = ProjectSettings.get_setting(
		"game/config/gameplay/projection/detect_collision"
	)
	projection_gravity = ProjectSettings.get_setting(
		"game/config/gameplay/projection/use_local_gravity"
	)

	default_text_speed = ProjectSettings.get_setting("game/config/text/default_text_speed")
	default_physics_ticks_per_second = ProjectSettings.get_setting(
		"physics/common/physics_ticks_per_second"
	)


func _load_audio_bus_override() -> void:
	# Load override audio bus file
	if FileAccess.file_exists(audio_bus_file):
		print_debug("Loading audio bus override from ", audio_bus_file)
		var bus_layout: AudioBusLayout = load(audio_bus_file)
		AudioServer.set_bus_layout(bus_layout)


func write() -> void:
	print_debug("Writing settings to ", settings_file)
	ProjectSettings.save_custom(settings_file)
	print_debug("Writing audio bus levels to ", audio_bus_file)
	ResourceSaver.save(AudioServer.generate_bus_layout(), audio_bus_file)
