@tool
# warning-ignore-all:return_value_discarded

# ############################################################################ #
# Copyright © 2019-2022 Frédéric Maquin <fred@ephread.com>
# Licensed under the MIT License.
# See LICENSE in the project root for license information.
# ############################################################################ #

extends Control

# Hiding this type to prevent registration of "private" nodes.
# See https://github.com/godotengine/godot-proposals/issues/1047
# class_name InkBottomPanel

# ############################################################################ #
# Imports
# ############################################################################ #

var InkStoryPanelScene = load("res://addons/inkgd/editor/panel/stories/ink_story_panel.tscn")
var InkPreviewPanelScene = load("res://addons/inkgd/editor/panel/preview/ink_preview_panel.tscn")
var InkConfigurationPanelScene = load("res://addons/inkgd/editor/panel/configuration/ink_configuration_panel.tscn")

# ############################################################################ #
# Properties
# ############################################################################ #

var editor_interface: InkEditorInterface = null
var configuration: InkConfiguration = null

# ############################################################################ #
# Private Properties
# ############################################################################ #

var _progress_texture: AnimatedTexture

# ############################################################################ #
# Hierarchy Nodes
# ############################################################################ #

@onready var _tab_container: TabContainer = $TabContainer
@onready var _beta_button: LinkButton = $MarginContainer/LinkButton

@onready var _story_panel = InkStoryPanelScene.instantiate()
@onready var _preview_panel = InkPreviewPanelScene.instantiate()
@onready var _configuration_panel = InkConfigurationPanelScene.instantiate()

# ############################################################################ #
# Overrides
# ############################################################################ #

func _ready():
	# FIXME: This needs investigating.
	# Sanity check. It seems the editor instantiates tools script on their
	# own, probably to add them to its tree. In that case, they won't have
	# their dependencies injected, so we're not doing anything.
	if editor_interface == null || configuration == null:
		print("[inkgd] [INFO] Ink Bottom Panel: dependencies not met, ignoring.")
		return

	_progress_texture = _create_progress_texture()

	_story_panel.editor_interface = editor_interface
	_story_panel.configuration = configuration
	_story_panel.progress_texture = _progress_texture

	_preview_panel.editor_interface = editor_interface
	_preview_panel.configuration = configuration
	_preview_panel.progress_texture = _progress_texture

	_configuration_panel.editor_interface = editor_interface
	_configuration_panel.configuration = configuration

	_tab_container.add_child(_story_panel)
	_tab_container.add_child(_preview_panel)
	_tab_container.add_child(_configuration_panel)

	_beta_button.connect("pressed", Callable(self, "_open_github_issues"))

	_set_minimum_panel_size()


# ############################################################################ #
# Signals Receivers
# ############################################################################ #

func _open_github_issues():
	OS.shell_open("https://github.com/ephread/inkgd/issues/new?assignees=&labels=&template=bug_report.md")

# ############################################################################ #
# Private helpers
# ############################################################################ #

func _create_progress_texture() -> AnimatedTexture:
	var animated_texture = AnimatedTexture.new()
	animated_texture.frames = 8

	for index in range(8):
		var texture = get_theme_icon(str("Progress", (index + 1)), "EditorIcons")
		animated_texture.set_frame_texture(index, texture)

	return animated_texture

func _set_minimum_panel_size():
	# Adapting the minimum size of the panel to the scale of the editor.
	custom_minimum_size = Vector2(900, 245) * editor_interface.scale
