class_name DebugPanel
extends CanvasLayer

# Le panneau de débogage, sous F3.
#
# Il montre ce qu'un contrôle headless ne peut pas montrer — ce que le clavier
# envoie réellement à la fenêtre, la cadence, les jets de butin — et il offre
# quelques gestes qui sautent le trajet normal du jeu: éprouver une branche de
# l'arbre d'upgrades demandait sinon de jouer la partie jusqu'à pouvoir se la
# payer.
#
# Pourquoi un fichier à part plutôt que dans le pont 3D, qui l'affiche: le pont
# ne décide d'aucune règle et n'écrit jamais dans l'état du jeu — un contrôle
# veille sur cet invariant. Donner des rondelles est un geste de jeu. Le pont
# montre, ce panneau agit.

## Ce qu'un bouton donne, quand il donne des rondelles. Assez pour éprouver
## n'importe quelle branche de l'arbre sans jouer la partie.
const COIN_GRANT := 1000000

var _label: Label

func _ready() -> void:
	layer = 90
	_label = Label.new()
	_label.position = Vector2(20, 150)
	_label.add_theme_font_size_override("font_size", 18)
	_label.add_theme_color_override("font_color", Color("9dfc9d"))
	add_child(_label)
	_build_buttons()

## Les gestes, en colonne au-dessus du texte.
##
## `focus_mode` reste à NONE: un bouton qui garde le focus après un clic avale
## les touches de déplacement, et le héros reste planté sans qu'on comprenne
## pourquoi.
func _build_buttons() -> void:
	var column := VBoxContainer.new()
	column.position = Vector2(20, 100)
	column.add_theme_constant_override("separation", 6)
	add_child(column)
	for entry: Array in _actions():
		var button := Button.new()
		button.text = str(entry[0])
		button.focus_mode = Control.FOCUS_NONE
		button.pressed.connect(entry[1])
		column.add_child(button)

## Ce que le panneau sait faire. Une liste plutôt qu'une suite d'appels: en
## ajouter un demande une ligne, et le contrôle les parcourt tous.
func _actions() -> Array:
	return [
		["+%s rondelles" % thousands(COIN_GRANT), grant_coins],
	]

func grant_coins() -> void:
	GameState.add_coins(COIN_GRANT)
	GameState.toast_requested.emit("Débogage: +%s rondelles" % thousands(COIN_GRANT))

func show_lines(lines: Array) -> void:
	if _label != null and is_instance_valid(_label):
		_label.text = "\n".join(lines)

## Un nombre lisible d'un coup d'œil: 1 000 000 plutôt que 1000000.
static func thousands(amount: int) -> String:
	var digits := str(absi(amount))
	var grouped := ""
	for index: int in digits.length():
		if index > 0 and (digits.length() - index) % 3 == 0:
			grouped += " "
		grouped += digits[index]
	return ("-" if amount < 0 else "") + grouped
