@tool
extends EditorExportPlugin


const PATH_EXTENSION_DEF = "res://.godot/extension_list.cfg"

var gdextensions_exclude_list : Array
var extension_definition_buffer : String = "default"


func _get_name() -> String:
	return "GodotXRToggleExport"


func _export_begin(features : PackedStringArray, _is_debug : bool, _path : String, _flags : int) -> void:
	# GDExtension export disable
	var gdextension_exclude_platforms : Dictionary = ProjectSettings.get_setting("godot_xr_toggle/export/exclude_gdextensions_from_export", {})
	for platform_name : String in gdextension_exclude_platforms.keys():
		if features.has(platform_name):
			gdextensions_exclude_list = gdextension_exclude_platforms[platform_name]
	
	if not gdextensions_exclude_list.is_empty():
		var file_extension_list := FileAccess.open(PATH_EXTENSION_DEF, FileAccess.READ)
		var extensions : String = file_extension_list.get_as_text()
		file_extension_list.close()

		extension_definition_buffer = extensions
		
		var lines : PackedStringArray = extensions.split("\n")
		var extensions_without_excluded : String = ""
		
		for line in lines:
			for gdextension_name in gdextensions_exclude_list:
				if not gdextension_name in line:
					extensions_without_excluded += line + "\n"
		
		extensions_without_excluded = extensions_without_excluded.trim_suffix("\n")

		file_extension_list = FileAccess.open(PATH_EXTENSION_DEF, FileAccess.WRITE)
		file_extension_list.store_string(extensions_without_excluded)
		file_extension_list.close()
	
	# XR Mode force mode
	var force_mode_platforms : Dictionary = ProjectSettings.get_setting("godot_xr_toggle/export/platforms_force_mode", {})
	for platform_name : String in force_mode_platforms.keys():
		if features.has(platform_name):
			ProjectSettings.set_setting("xr/openxr/enabled", force_mode_platforms[platform_name])
			break


func _export_file(path : String, _type : String, _features : PackedStringArray) -> void:
	# Remove editor-only override file before exporting
	if path == "res://override.cfg":
		skip()
	
	# Skip predefined GDExtensions
	elif not gdextensions_exclude_list.is_empty():
		for gdextension_name in gdextensions_exclude_list:
			if gdextension_name in path:
				gdextensions_exclude_list.erase(gdextension_name)
				skip()
				break

# Restore gdextension list
func _export_end() -> void:
	gdextensions_exclude_list.clear()
	if extension_definition_buffer != "default":
		var file_extension_list := FileAccess.open(PATH_EXTENSION_DEF, FileAccess.WRITE)
		file_extension_list.store_string(extension_definition_buffer)
		file_extension_list.close()
		extension_definition_buffer = "default"