Settings.cs
namespace CryptidHunt;

public class Settings
{
	private const string SETTINGS_FILE = "settings.json";

	public static Settings Instance
	{
		get
		{
			_instance ??= new Settings();
			return _instance;
		}
		private set
		{
			_instance = value;
		}
	}
	private static Settings _instance;

	public class SettingsSchema
	{
		public bool BeatenTheGame { get; set; }
		public float? Darkness { get; set; }
	}

	public bool BeatenTheGame => _settings.BeatenTheGame;
	public float? Darkness => _settings.Darkness;

	public SettingsSchema DefaultSettings => new() { BeatenTheGame = false, Darkness = null };

	private SettingsSchema _settings;

	public Settings()
	{
		try
		{
			_settings = FileSystem.Data.ReadJson( SETTINGS_FILE, DefaultSettings );
			Validate();
		}
		catch ( Exception ex )
		{
			Log.Error( $"Caught an exception while trying to load the settings, falling back to defaults: ({ex})" );
			_settings = DefaultSettings;
		}
	}

	private void Validate()
	{
		_settings.Darkness = Darkness?.Clamp( 0f, 1f );
	}

	public void Change( Action<SettingsSchema> settingsChanger )
	{
		settingsChanger?.Invoke( _settings );
		Save();
	}

	public void Save()
	{
		FileSystem.Data.WriteJson( SETTINGS_FILE, _settings );
	}

	public void Reset()
	{
		_settings = DefaultSettings;
		Save();
	}

	[ConCmd( "debug_beat_the_game" )]
	static void DebugBeatTheGame()
	{
		Settings.Instance.Change( settings => settings.BeatenTheGame = true );
	}
}