using System;
using System.Text.Json;
using Godot;
namespace Babushka.scripts.CSharp.Common.Savegame;
///
/// Handles the saving and loading of local settings data.
///
[GlobalClass]
public partial class SettingsSaveController : Node
{
public static string SETTINGS_FILE_PATH = "user://userSettings.json";
public static SettingsSaveController Instance;
public SettingsData? settings = new SettingsData();
public SettingsData settingsDefault = new SettingsData();
public event Action OnSettingsReloaded;
private bool _loadedData;
private DateTime _readyTime;
public bool LoadedData => _loadedData;
public override void _EnterTree()
{
SETTINGS_FILE_PATH = ProjectSettings.GlobalizePath(SETTINGS_FILE_PATH);
_readyTime = DateTime.Now;
Instance = this;
LoadSettings();
}
public override void _ExitTree()
{
if (settings != null)
settings.runtimeSeconds += (DateTime.Now - _readyTime).TotalSeconds;
SaveSettings();
Instance = null;
}
///
/// Saves Settings Data onto disk.
///
public void SaveSettings()
{
try
{
string jsonString = JsonSerializer.Serialize(
settings,
new JsonSerializerOptions() { WriteIndented = true}
);
System.IO.File.WriteAllText(SETTINGS_FILE_PATH, jsonString);
}
catch (Exception e)
{
GD.PrintErr("Error Saving Settings:", e);
Console.WriteLine(e);
}
}
///
/// Loads Settings data from disk.
///
public void LoadSettings()
{
_loadedData = false;
try
{
if (!System.IO.File.Exists(SETTINGS_FILE_PATH))
{
settings = new SettingsData();
}
else
{
string jsonString = System.IO.File.ReadAllText(SETTINGS_FILE_PATH);
SettingsData? loadedSettings = JsonSerializer.Deserialize(jsonString);
if (loadedSettings != null && !loadedSettings.IsVersionValid())
{
_loadedData = false;
}
else
{
settings = loadedSettings;
_loadedData = true;
}
}
}
catch (Exception e)
{
GD.PrintErr("Loading Error:", e);
Console.WriteLine(e);
}
}
///
/// Resets Settings to default.
///
public void ResetSettings()
{
settings = JsonSerializer.Deserialize(JsonSerializer.Serialize(settingsDefault));
OnSettingsReloaded?.Invoke();
}
}