extends Node

const DEFAULT_SAVE_FILE_PATH = "user://savegame.save"

var _save_file_path: String
var _save_dictionary: Dictionary = {}

# Public Methods
func UpdateData(key: String, value: Variant) -> void:
	_save_dictionary[key] = value


func UpdateNode(node_path: NodePath, value: Variant) -> void:
	UpdateData(str(node_path), value)


func GetData(key: String) -> Variant:
	if not _save_dictionary.has(key):
		return null
	return _save_dictionary[key]


func GetNode(node_path: NodePath) -> Variant:
	var key := str(node_path)
	return GetData(key)


func HasData(node_path: NodePath) -> bool:
	return _save_dictionary.has(node_path)


func SaveToDisk() -> void:
	if !_save_file_path:
		return
	
	var save_file := FileAccess.open(_save_file_path, FileAccess.WRITE)
	var json := JSON.stringify(_save_dictionary)
	
	save_file.store_line(json)


func LoadFromDisk(save_file_path: String) -> void:
	_save_file_path = save_file_path
	
	if not FileAccess.file_exists(save_file_path):
		print_rich("[color=yellow]Save file at path %s does not exist, creating new save file...[/color]" % save_file_path)
		return
	
	var save_file := FileAccess.open(save_file_path, FileAccess.READ)
	print("Loading save file from path: %s" % save_file.get_path_absolute())
	
	if save_file.get_position() >= save_file.get_length():
		print("Save file was empty...")
		return
	
	var line := save_file.get_line()
	var json = JSON.new()
	var parse_result := json.parse(line)
	if parse_result != OK:
		print("Parsing result when loading file: [%s] in %s at line %d" % [json.get_error_message(), line, json.get_error_line()])
		return
	
	print("JSON data parsed: [%d]" % typeof(json.data))
	
	var data_dict: Dictionary = json.data
	_save_dictionary = data_dict
