class_name ModConfig
extends Resource

# This Class is used to represent a configuration for a mod.
# The Class provides functionality to initialize, validate, save, and remove a mod's configuration.

const LOG_NAME := "ModLoader:ModConfig"

# Name of the config - must be unique
var name: String
# The mod_id this config belongs to
var mod_id: String
# The JSON-Schema this config uses for validation
var schema: Dictionary
# The data this config holds
var data: Dictionary
# The path where the JSON file for this config is stored
var save_path: String
# False if any data is invalid
var is_valid := false


func _init(_mod_id: String, _data: Dictionary, _save_path: String, _schema: Dictionary = {}) -> void:
	name = _ModLoaderPath.get_file_name_from_path(_save_path, true, true)
	mod_id = _mod_id
	schema = ModLoaderStore.mod_data[_mod_id].manifest.config_schema if _schema.empty() else _schema
	data = _data
	save_path = _save_path

	var error_message := validate()

	if not error_message == "":
		ModLoaderLog.error("Mod Config for mod \"%s\" failed JSON Schema Validation with error message: \"%s\"" % [mod_id, error_message], LOG_NAME)
		return

	is_valid = true


func get_data_as_string() -> String:
	return JSON.print(data)


func get_schema_as_string() -> String:
	return JSON.print(schema)


# Empty string if validation was successful
func validate() -> String:
	var json_schema := JSONSchema.new()
	var error := json_schema.validate(get_data_as_string(), get_schema_as_string())

	if error.empty():
		is_valid = true
	else:
		is_valid = false

	return error


# Runs the JSON-Schema validation and returns true if valid
func is_valid() -> bool:
	if validate() == "":
		is_valid = true
		return true

	is_valid = false
	return false


# Saves the config data to the config file
func save_to_file() -> bool:
	var is_success := _ModLoaderFile.save_dictionary_to_json_file(data, save_path)
	return is_success


# Removes the config file
func remove_file() -> bool:
	var is_success := _ModLoaderFile.remove_file(save_path)
	return is_success
