class_name KeybindEntry
extends HBoxContainer

signal bind_button_pressed(button: Button)

var action_string: String
var event_buttons: Array[BindButton]


func to_array() -> Array:
	var binding_list: Array = []
	binding_list.append([action_string])
	for button: BindButton in event_buttons:
		var binding: Array = []
		if button.trigger_event is InputEventKey:
			binding.append("InputEventKey")
			binding.append(button.trigger_event.physical_keycode)
		if button.trigger_event is InputEventMouseButton:
			binding.append("InputEventMouseButton")
			binding.append(button.trigger_event.button_index)
		if button.trigger_event is InputEventJoypadButton:
			binding.append("InputEventJoypadButton")
			binding.append(button.trigger_event.button_index)
		binding_list.append(binding)
	return binding_list


func populate_from_array(binding_list: Array) -> void:
	action_string = binding_list[0][0]
	for i: int in binding_list.size() - 1:
		if i == 0:
			continue
		for binding: Array in binding_list[i]:
			add_bind_button(KeymapData.event_from_array(binding))


func set_action_name(action_name: String) -> void:
	action_string = action_name
	$ActionName.text = action_name


func button_pressed(button: Button) -> void:
	bind_button_pressed.emit(button)


func set_button_bind(event: InputEvent, button: BindButton) -> void:
	button.trigger_event = event
	button.text = ""
	if event is InputEventKey:
		if KeyIconMap.keys.has(str(event.physical_keycode)):
			button.icon = load(KeyIconMap.keys[str(event.physical_keycode)])
	elif event is InputEventMouseButton:
		if event.button_index == 4:
			button.icon = load(KeyIconMap.mouse_buttons[str(event.button_index)])
		elif event.button_index == 5:
			button.icon = load(KeyIconMap.mouse_buttons[str(event.button_index)])
		elif event.button_index == 6:
			button.text = "Mouse Wheel Left"
		elif event.button_index == 7:
			button.text = "Mouse Wheel Right"
		elif event.button_index == 8:
			button.text = "Mouse Button 4"
		elif event.button_index == 9:
			button.text = "Mouse Button 5"
		elif KeyIconMap.mouse_buttons.has(str(event.button_index)):
			button.icon = load(KeyIconMap.mouse_buttons[str(event.button_index)])
	elif event is InputEventJoypadButton:
		if Input.get_joy_name(event.device) == "Xbox 360 Controller":
			button.icon = load(KeyIconMap.xbox_360_keys[str(event.button_index)])
		elif Input.get_joy_name(event.device) == "Xbox Series Controller":
			button.icon = load(KeyIconMap.xbox_series_keys[str(event.button_index)])
		elif Input.get_joy_name(event.device).contains("Playstation"):
			button.icon = load(KeyIconMap.playstation_keys[str(event.button_index)])


func set_cross_button_visibility(button: Button, visibility: bool) -> void:
	button.visible = visibility


func add_bind_button(event: InputEvent) -> BindButton:
	#Create binding button
	var new_button: BindButton = BindButton.new()
	new_button.mouse_filter = Control.MOUSE_FILTER_PASS
	new_button.size_flags_vertical = Control.SIZE_EXPAND_FILL
	new_button.custom_minimum_size = Vector2(75.0, 75.0)
	new_button.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER
	new_button.expand_icon = true
	new_button.pressed.connect(button_pressed.bind(new_button))
	if event:
		set_button_bind(event, new_button)
	event_buttons.append(new_button)
	
	#Create delete button
	var cross_button: Button = Button.new()
	cross_button.icon = load("res://Assets/Textures/flair_disabled_cross.png")
	cross_button.visible = false
	cross_button.mouse_filter = Control.MOUSE_FILTER_PASS
	cross_button.size_flags_vertical = Control.SIZE_EXPAND_FILL
	cross_button.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER
	cross_button.expand_icon = true
	cross_button.pressed.connect(remove_bind_button.bind(new_button))
	
	#Create vbox to hold buttons
	var vbox: VBoxContainer = VBoxContainer.new()
	vbox.mouse_filter = Control.MOUSE_FILTER_STOP
	vbox.custom_minimum_size = Vector2(100.0, 100.0)
	vbox.mouse_entered.connect(set_cross_button_visibility.bind(cross_button, true))
	vbox.mouse_exited.connect(set_cross_button_visibility.bind(cross_button, false))
	
	#Add buttons to vbox and add vbox to button grid
	vbox.add_child(new_button)
	vbox.add_child(cross_button)
	$Buttons.add_child(vbox)
	$Buttons.move_child(vbox, $Buttons.get_child_count() - 2)
	
	return new_button


func remove_bind_button(button: BindButton) -> void:
	event_buttons.erase(button)
	button.get_parent().queue_free()


func _on_add_bind_button_pressed() -> void:
	add_bind_button(null).pressed.emit()
