@tool
extends RefCounted

const BASE = "addons/git_describe/"

const SETTING_PATH_SETTING = BASE + "describe_setting_path"
const DEFAULT_SETTING_PATH = "application/config/git_describe"

const APPEND_PROJECT_NAME_SETTING = BASE + "append_describe_to_project_name"
const DEFAULT_APPEND_PROJECT_NAME = false
const PROJECT_NAME_SETTING = "application/config/name"

const COMMAND_OPTIONS_SETTING = BASE + "command_options"
const DEFAULT_COMMAND_OPTIONS = "--always"

static var cached_describe: String


static func init_setting(
		setting_name: String,
		initial_value: Variant,
		basic := true
) -> void:
	if not ProjectSettings.has_setting(setting_name):
		ProjectSettings.set_setting(setting_name, initial_value)

	ProjectSettings.set_as_basic(setting_name, basic)
	ProjectSettings.set_initial_value(setting_name, initial_value)


static func init_settings() -> void:
	init_setting(SETTING_PATH_SETTING, DEFAULT_SETTING_PATH)
	init_setting(APPEND_PROJECT_NAME_SETTING, DEFAULT_APPEND_PROJECT_NAME)
	init_setting(COMMAND_OPTIONS_SETTING, DEFAULT_COMMAND_OPTIONS, false)


static func append_project_name(describe: String, append: bool) -> void:
	if not ProjectSettings.get_setting(APPEND_PROJECT_NAME_SETTING, false):
		return

	var project_name: String = ProjectSettings.get_setting(
			PROJECT_NAME_SETTING
	)
	var separated_describe: String = " " + describe
	match [append, project_name.ends_with(separated_describe)]:
		[false, true]:
			cached_describe = ""
			project_name = project_name.replace(separated_describe, "")

		[true, false]:
			cached_describe = describe
			project_name += separated_describe

	ProjectSettings.set_setting(PROJECT_NAME_SETTING, project_name)
	ProjectSettings.save()


static func get_command_options() -> String:
	return ProjectSettings.get_setting(
			COMMAND_OPTIONS_SETTING,
			DEFAULT_COMMAND_OPTIONS
	)


static func set_describe_setting(value: Variant) -> void:
	var describe_setting: String = ProjectSettings.get_setting(
			SETTING_PATH_SETTING,
			DEFAULT_SETTING_PATH
	)
	ProjectSettings.set_setting(describe_setting, value)
	ProjectSettings.save()