tool
extends AcceptDialog

var DrawGD : Node = null

# Preferences table: [Prop name in DrawGD, relative node path, value type, default value]
var preferences = []

var selected_item := 0

onready var list : ItemList = $HSplitContainer/List
onready var right_side : VBoxContainer = $HSplitContainer/ScrollContainer/VBoxContainer
onready var autosave_interval : SpinBox = $HSplitContainer/ScrollContainer/VBoxContainer/Backup/AutosaveContainer/AutosaveInterval
onready var restore_default_button_scene = preload("res://addons/draw_gd/src/Preferences/RestoreDefaultButton.tscn")

func load_prefs():
	preferences = [
	["open_last_project", "Startup/StartupContainer/OpenLastProject", "pressed", DrawGD.open_last_project],
	["smooth_zoom", "Canvas/ZoomOptions/SmoothZoom", "pressed", DrawGD.smooth_zoom],
	["pressure_sensitivity_mode", "Startup/PressureSentivity/PressureSensitivityOptionButton", "selected", DrawGD.pressure_sensitivity_mode],
	["show_left_tool_icon", "Indicators/IndicatorsContainer/LeftToolIconCheckbox", "pressed", DrawGD.show_left_tool_icon],
	["show_right_tool_icon", "Indicators/IndicatorsContainer/RightToolIconCheckbox", "pressed", DrawGD.show_right_tool_icon],
	["left_square_indicator_visible", "Indicators/IndicatorsContainer/LeftIndicatorCheckbox", "pressed", DrawGD.left_square_indicator_visible],
	["right_square_indicator_visible", "Indicators/IndicatorsContainer/RightIndicatorCheckbox", "pressed", DrawGD.right_square_indicator_visible],
	["autosave_interval", "Backup/AutosaveContainer/AutosaveInterval", "value", DrawGD.autosave_interval],
	["enable_autosave", "Backup/AutosaveContainer/EnableAutosave", "pressed", DrawGD.enable_autosave],

	["default_image_width", "Image/ImageOptions/ImageDefaultWidth", "value", DrawGD.default_image_width],
	["default_image_height", "Image/ImageOptions/ImageDefaultHeight", "value", DrawGD.default_image_height],
	["default_fill_color", "Image/ImageOptions/DefaultFillColor", "color", DrawGD.default_fill_color],

	["grid_type", "Canvas/GridOptions/GridType", "selected", DrawGD.grid_type],
	["grid_width", "Canvas/GridOptions/GridWidthValue", "value", DrawGD.grid_width],
	["grid_height", "Canvas/GridOptions/GridHeightValue", "value", DrawGD.grid_height],
	["grid_isometric_cell_size", "Canvas/GridOptions/IsometricCellSizeValue", "value", DrawGD.grid_isometric_cell_size],
	["grid_color", "Canvas/GridOptions/GridColor", "color", DrawGD.grid_color],
	["guide_color", "Canvas/GuideOptions/GuideColor", "color", DrawGD.guide_color],
	["checker_size", "Canvas/CheckerOptions/CheckerSizeValue", "value", DrawGD.checker_size],
	["checker_color_1", "Canvas/CheckerOptions/CheckerColor1", "color", DrawGD.checker_color_1],
	["checker_color_2", "Canvas/CheckerOptions/CheckerColor2", "color", DrawGD.checker_color_2],
	["checker_follow_movement", "Canvas/CheckerOptions/CheckerFollowMovement", "pressed", DrawGD.checker_follow_movement],
	["checker_follow_scale", "Canvas/CheckerOptions/CheckerFollowScale", "pressed", DrawGD.checker_follow_scale],
	]

func _ready() -> void:
	var n : Node = get_parent()
	while n:
		if n.name == "DrawGDSingleton":
			DrawGD = n
			break
		n = n.get_parent()
		
	load_prefs()
	
	# Replace OK with Close since preference changes are being applied immediately, not after OK confirmation
	get_ok().text = tr("Close")

	if OS.get_name() == "HTML5":
		right_side.get_node("Startup").queue_free()
		right_side.get_node("Languages").visible = true
		DrawGD.open_last_project = false

	for pref in preferences:
		var node = right_side.get_node(pref[1])
		var node_position = node.get_index()

		var restore_default_button : BaseButton = restore_default_button_scene.instance()
		restore_default_button.setting_name = pref[0]
		restore_default_button.value_type = pref[2]
		restore_default_button.default_value = pref[3]
		restore_default_button.node = node
		node.get_parent().add_child(restore_default_button)
		node.get_parent().move_child(restore_default_button, node_position)

		match pref[2]:
			"pressed":
				node.connect("toggled", self, "_on_Preference_toggled", [pref[0], pref[3], restore_default_button])
			"value":
				node.connect("value_changed", self, "_on_Preference_value_changed", [pref[0], pref[3], restore_default_button])
			"color":
				node.get_picker().presets_visible = false
				node.connect("color_changed", self, "_on_Preference_color_changed", [pref[0], pref[3], restore_default_button])
			"selected":
				node.connect("item_selected", self, "_on_Preference_item_selected", [pref[0], pref[3], restore_default_button])

		if DrawGD.config_cache.has_section_key("preferences", pref[0]):
			var value = DrawGD.config_cache.get_value("preferences", pref[0])
			DrawGD.set(pref[0], value)
			node.set(pref[2], value)

			# This is needed because color_changed doesn't fire if the color changes in code
			if pref[2] == "color":
				preference_update(pref[0])
				disable_restore_default_button(restore_default_button, DrawGD.get(pref[0]).is_equal_approx(pref[3]))
			elif pref[2] == "selected":
				preference_update(pref[0])
				disable_restore_default_button(restore_default_button, DrawGD.get(pref[0]) == pref[3])


func _on_Preference_toggled(button_pressed : bool, prop : String, default_value, restore_default_button : BaseButton) -> void:
	DrawGD.set(prop, button_pressed)
	DrawGD.config_cache.set_value("preferences", prop, button_pressed)
	preference_update(prop)
	disable_restore_default_button(restore_default_button, DrawGD.get(prop) == default_value)


func _on_Preference_value_changed(value : float, prop : String, default_value, restore_default_button : BaseButton) -> void:
	DrawGD.set(prop, value)
	DrawGD.config_cache.set_value("preferences", prop, value)
	preference_update(prop)
	disable_restore_default_button(restore_default_button, DrawGD.get(prop) == default_value)


func _on_Preference_color_changed(color : Color, prop : String, default_value, restore_default_button : BaseButton) -> void:
	DrawGD.set(prop, color)
	DrawGD.config_cache.set_value("preferences", prop, color)
	preference_update(prop)
	disable_restore_default_button(restore_default_button, DrawGD.get(prop).is_equal_approx(default_value))


func _on_Preference_item_selected(id : int, prop : String, default_value, restore_default_button : BaseButton) -> void:
	DrawGD.set(prop, id)
	DrawGD.config_cache.set_value("preferences", prop, id)
	preference_update(prop)
	disable_restore_default_button(restore_default_button, DrawGD.get(prop) == default_value)


func preference_update(prop : String) -> void:
	if prop in ["autosave_interval", "enable_autosave"]:
		DrawGD.opensave.update_autosave()
		autosave_interval.editable = DrawGD.enable_autosave
		if autosave_interval.editable:
			autosave_interval.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
		else:
			autosave_interval.mouse_default_cursor_shape = Control.CURSOR_FORBIDDEN

	if prop in ["grid_type", "grid_width", "grid_height", "grid_isometric_cell_size", "grid_color"]:
		DrawGD.canvas.grid.isometric_polylines.clear()
		DrawGD.canvas.grid.update()

	if prop in ["checker_size", "checker_color_1", "checker_color_2", "checker_follow_movement", "checker_follow_scale"]:
		DrawGD.transparent_checker._ready()

	if prop in ["guide_color"]:
		for guide in DrawGD.canvas.get_children():
			if guide is Guide:
				guide.default_color = DrawGD.guide_color

	DrawGD.config_cache.save("user://cache.ini")


func disable_restore_default_button(button : BaseButton, disable : bool) -> void:
	button.disabled = disable
	if disable:
		button.mouse_default_cursor_shape = Control.CURSOR_ARROW
		button.hint_tooltip = ""
	else:
		button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
		button.hint_tooltip = "Restore default value"


func _on_PreferencesDialog_about_to_show(changed_language := false) -> void:
	if OS.get_name() != "HTML5":
		list.add_item("  " + tr("Startup"))
	list.add_item("  " + tr("Language"))
	list.add_item("  " + tr("Canvas"))
	list.add_item("  " + tr("Image"))
	list.add_item("  " + tr("Shortcuts"))
	list.add_item("  " + tr("Backup"))
	list.add_item("  " + tr("Indicators"))

	list.select(1 if changed_language else selected_item)
	autosave_interval.suffix = tr("minute(s)")


func _on_PreferencesDialog_popup_hide() -> void:
	list.clear()


func _on_List_item_selected(index : int) -> void:
	selected_item = index
	for child in right_side.get_children():
		var content_list = ["Startup", "Languages", "Canvas", "Image", "Shortcuts", "Backup", "Indicators"]
		if OS.get_name() == "HTML5":
			content_list.erase("Startup")
		child.visible = child.name == content_list[index]
