extends Control

## Test run editor.
##
## Tests can be created and modified visually, and saved as JSON
## files into [member TESTS_DIR].

var models: Array[Mesh] = [
	preload("res://assets/models/bench.obj"),
	preload("res://assets/models/cube.obj"),
	preload("res://assets/models/cylinder.obj"),
	preload("res://assets/models/monkey.obj"),
	preload("res://assets/models/plane.obj")
]

@onready var name_edit: LineEdit = %NameEdit
@onready var channel_count_spin_box: SpinBox = %ChannelCountSpinBox
@onready var tests_option_button: OptionButton = %TestsOptionButton
@onready var model_option_button: OptionButton = %ModelOptionButton
@onready var mesh_instance: MeshInstance3D = %MeshInstance

const TESTS_DIR = "res://tests/tests/"

var test := Test.new()

func _ready() -> void:
	reload_test_list()
	for model in models:
		model_option_button.add_item(model.resource_path.get_file().get_basename().to_pascal_case())
		model_option_button.set_item_metadata(model_option_button.item_count - 1, model)


func reload_test_list():
	tests_option_button.clear()
	for test_file in DirAccess.get_files_at(TESTS_DIR):
		var found_test := load(TESTS_DIR.path_join(test_file)) as Test
		tests_option_button.add_item(found_test.name)
		tests_option_button.set_item_metadata(
				tests_option_button.item_count - 1, found_test)
	tests_option_button.selected = -1


func _on_save_button_pressed() -> void:
	if test.name.is_empty():
		return
	var _err := ResourceSaver.save(test,
			TESTS_DIR.path_join("%s.json" % test.name.to_snake_case()))
	reload_test_list()


func _on_tests_option_button_item_selected(index: int) -> void:
	var test_file: String = tests_option_button.get_item_metadata(index)
	var data: Test = load(TESTS_DIR.path_join(test_file))
	load_data(data)


func load_data(data: Test) -> void:
	name_edit.text = data.name
	channel_count_spin_box.value = data.channels


func _on_new_button_pressed() -> void:
	channel_count_spin_box.value = 1
	name_edit.clear()
	tests_option_button.selected = -1


func _on_painted_model_container_stroke_added(from: Vector2, to: Vector2) -> void:
	test.steps.append(PaintStep.new(from, to))


func _on_model_option_button_item_selected(index: int) -> void:
	var mesh: Mesh = model_option_button.get_item_metadata(index)
	mesh_instance.mesh = mesh


func _on_name_edit_text_changed(new_text: String) -> void:
	test.name = new_text