class_name RewardMenu
extends CanvasLayer

# Choix de récompense entre deux salles.
#
# Le menu ne connaît ni les statistiques ni les modificateurs: il affiche les
# identifiants qu'on lui donne et signale celui que le joueur retient. Poser la
# récompense reste le travail de `DiveMap.take_reward`.

signal reward_chosen(reward_id: String)

const CARD_SIZE := Vector2(360, 250)

var offered: Array[String] = []
var _root: Control
var _cards: HBoxContainer

func _ready() -> void:
	layer = 20
	_build()
	hide_menu()

func _build() -> void:
	_root = Control.new()
	_root.set_anchors_preset(Control.PRESET_FULL_RECT)
	_root.mouse_filter = Control.MOUSE_FILTER_STOP
	add_child(_root)

	var backdrop := ColorRect.new()
	backdrop.set_anchors_preset(Control.PRESET_FULL_RECT)
	backdrop.color = Color(0.05, 0.04, 0.09, 0.82)
	backdrop.mouse_filter = Control.MOUSE_FILTER_IGNORE
	_root.add_child(backdrop)

	var column := VBoxContainer.new()
	column.set_anchors_preset(Control.PRESET_CENTER)
	column.alignment = BoxContainer.ALIGNMENT_CENTER
	column.add_theme_constant_override("separation", 18)
	column.grow_horizontal = Control.GROW_DIRECTION_BOTH
	column.grow_vertical = Control.GROW_DIRECTION_BOTH
	_root.add_child(column)

	var title := Label.new()
	title.name = "Title"
	title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
	title.add_theme_font_size_override("font_size", 42)
	column.add_child(title)

	var subtitle := Label.new()
	subtitle.name = "Subtitle"
	subtitle.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
	subtitle.add_theme_font_size_override("font_size", 20)
	subtitle.add_theme_color_override("font_color", Color("b8c4d8"))
	column.add_child(subtitle)

	_cards = HBoxContainer.new()
	_cards.alignment = BoxContainer.ALIGNMENT_CENTER
	_cards.add_theme_constant_override("separation", 22)
	column.add_child(_cards)

	var skip := Button.new()
	skip.name = "Skip"
	skip.custom_minimum_size = Vector2(260, 48)
	skip.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
	skip.pressed.connect(_on_choice.bind(""))
	column.add_child(skip)

# `ids` est l'offre; la retenir permet au test de vérifier ce qui a été proposé.
func present(ids: Array[String]) -> void:
	offered = ids.duplicate()
	var title := _root.find_child("Title", true, false) as Label
	var subtitle := _root.find_child("Subtitle", true, false) as Label
	var skip := _root.find_child("Skip", true, false) as Button
	title.text = Loc.ui("ui.dungeon.reward_title")
	subtitle.text = Loc.ui("ui.dungeon.reward_subtitle")
	skip.text = Loc.ui("ui.dungeon.reward_skip")
	for stale: Node in _cards.get_children():
		stale.queue_free()
		_cards.remove_child(stale)
	for id: String in offered:
		_cards.add_child(_build_card(id))
		GameState.add_entity_counter("rewards", id, "total_offered")
	_root.visible = true
	visible = true
	var first: Button = skip
	if _cards.get_child_count() > 0:
		first = _cards.get_child(0) as Button
	first.grab_focus()

func _build_card(id: String) -> Button:
	var definition: Dictionary = DataCatalog.REWARDS.get(id, {})
	var card := Button.new()
	card.custom_minimum_size = CARD_SIZE
	card.clip_text = false
	card.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
	card.text = "%s\n\n%s" % [DataCatalog.reward_name(id), Loc.entity("rewards", id, "description")]
	card.add_theme_font_size_override("font_size", 22)
	card.tooltip_text = str(definition.get("description", ""))
	card.pressed.connect(_on_choice.bind(id))
	return card

func _on_choice(id: String) -> void:
	hide_menu()
	reward_chosen.emit(id)

func hide_menu() -> void:
	visible = false
	if _root != null:
		_root.visible = false

func is_open() -> bool:
	return visible

# Point d'entrée sans souris ni clavier, pour le test de fumée.
func choose(index: int) -> String:
	if index < 0 or index >= offered.size():
		_on_choice("")
		return ""
	var id := offered[index]
	_on_choice(id)
	return id
