extends Node2D

var Gut = load("res://addons/gut/gut.gd")
var ResultExporter = load("res://addons/gut/result_exporter.gd")
var GutConfig = load("res://addons/gut/gut_config.gd")

const RUNNER_JSON_PATH = "res://.gut_editor_config.json"
const RESULT_FILE = "user://.gut_editor.bbcode"
const RESULT_JSON = "user://.gut_editor.json"

var _gut_config = null
var _gut = null
var _wrote_results = false
# Flag for when this is being used at the command line.  Otherwise it is
# assumed this is being used by the panel and being launched with
# play_custom_scene
var _cmdln_mode = false

onready var _gut_layer = $GutLayer


func _ready():
	if _gut_config == null:
		_gut_config = GutConfig.new()
		_gut_config.load_options(RUNNER_JSON_PATH)

	# The command line will call run_tests on its own.  When used from the panel
	# we have to kick off the tests ourselves b/c there's no way I know of to
	# interact with the scene that was run via play_custom_scene.
	if !_cmdln_mode:
		call_deferred("run_tests")


func run_tests():
	if _gut == null:
		_gut = Gut.new()

	_gut.set_add_children_to(self)
	if _gut_config.options.gut_on_top:
		_gut_layer.add_child(_gut)
	else:
		add_child(_gut)

	if !_cmdln_mode:
		_gut.connect(
			"tests_finished",
			self,
			"_on_tests_finished",
			[_gut_config.options.should_exit, _gut_config.options.should_exit_on_success]
		)

	_gut_config.config_gut(_gut)
	if _gut_config.options.gut_on_top:
		_gut.get_gui().goto_bottom_right_corner()

	var run_rest_of_scripts = _gut_config.options.unit_test_name == ""
	_gut.test_scripts(run_rest_of_scripts)


func _write_results():
	# bbcode_text appears to be empty.  I'm not 100% sure why.  Until that is
	# figured out we have to just get the text which stinks.
	var content = _gut.get_gui().get_text_box().text

	var f = File.new()
	var result = f.open(RESULT_FILE, f.WRITE)
	if result == OK:
		f.store_string(content)
		f.close()
	else:
		print("ERROR Could not save bbcode, result = ", result)

	var exporter = ResultExporter.new()
	var f_result = exporter.write_summary_file(_gut, RESULT_JSON)
	_wrote_results = true


func _exit_tree():
	if !_wrote_results and !_cmdln_mode:
		_write_results()


func _on_tests_finished(should_exit, should_exit_on_success):
	_write_results()

	if should_exit:
		get_tree().quit()
	elif should_exit_on_success and _gut.get_fail_count() == 0:
		get_tree().quit()


func get_gut():
	if _gut == null:
		_gut = Gut.new()
	return _gut


func set_gut_config(which):
	_gut_config = which


func set_cmdln_mode(is_it):
	_cmdln_mode = is_it