extends GUIDETextProvider

var _is_on_desktop:bool = false

func _init():
	priority = 0
	_is_on_desktop = OS.has_feature("linuxbsd") or OS.has_feature("macos") or OS.has_feature("windows")
	
func supports(input:GUIDEInput) -> bool:
	return true
	

func _format(input:String) -> String:
	return "[%s]" % [input]

	
func get_text(input:GUIDEInput) -> String:
	if input is GUIDEInputKey:
		var result:PackedStringArray = []
		if input.control:
			var ctrl = GUIDEInputKey.new()
			ctrl.key = KEY_CTRL
			result.append(get_text(ctrl))
		if input.alt:
			var alt = GUIDEInputKey.new()
			alt.key = KEY_ALT
			result.append(get_text(alt))
		if input.shift:
			var shift = GUIDEInputKey.new()
			shift.key = KEY_SHIFT
			result.append(get_text(shift))
		if input.meta:
			var meta = GUIDEInputKey.new()
			meta.key = KEY_META
			result.append(get_text(meta))
		
		var the_key = input.key
		
		# if we are on desktop, translate the physical keycode into the actual label
		# this is not supported on mobile, so we have to check		
		if _is_on_desktop:
			the_key = DisplayServer.keyboard_get_label_from_physical(input.key)
			
		
		result.append(_format(OS.get_keycode_string(the_key)))
		return "+".join(result) 
	
	if input is GUIDEInputMouseAxis1D:
		match input.axis:
			GUIDEInputMouseAxis1D.GUIDEInputMouseAxis.X:
				return _format(tr("Mouse Left/Right"))
			GUIDEInputMouseAxis1D.GUIDEInputMouseAxis.Y:
				return _format(tr("Mouse Up/Down"))

	if input is GUIDEInputMouseAxis2D:
		return _format(tr("Mouse"))
		
	if input is GUIDEInputMouseButton:
		match input.button:
			MOUSE_BUTTON_LEFT:
				return _format(tr("Left Mouse Button"))
			MOUSE_BUTTON_RIGHT:
				return _format(tr("Right Mouse Button"))
			MOUSE_BUTTON_MIDDLE:
				return _format(tr("Middle Mouse Button"))
			MOUSE_BUTTON_WHEEL_UP:
				return _format(tr("Mouse Wheel Up"))
			MOUSE_BUTTON_WHEEL_DOWN:
				return _format(tr("Mouse Wheel Down"))
			MOUSE_BUTTON_WHEEL_LEFT:
				return _format(tr("Mouse Wheel Left"))
			MOUSE_BUTTON_WHEEL_RIGHT:
				return _format(tr("Mouse Wheel Right"))
			MOUSE_BUTTON_XBUTTON1:
				return _format(tr("Mouse Side 1"))
			MOUSE_BUTTON_XBUTTON2:
				return _format(tr("Mouse Side 2"))

	if input is GUIDEInputJoyAxis1D:
		match input.axis:
			JOY_AXIS_LEFT_X:
				return _format(tr("Stick 1 Horizontal"))
			JOY_AXIS_LEFT_Y:
				return _format(tr("Stick 1 Vertical"))
			JOY_AXIS_RIGHT_X:
				return _format(tr("Stick 2 Horizontal"))
			JOY_AXIS_RIGHT_Y:
				return _format(tr("Stick 2 Vertical"))
			JOY_AXIS_TRIGGER_LEFT:
				return _format(tr("Axis 3"))
			JOY_AXIS_TRIGGER_RIGHT:
				return _format(tr("Axis 4"))
	
	if input is GUIDEInputJoyAxis2D:
		match input.x:
			JOY_AXIS_LEFT_X, JOY_AXIS_LEFT_Y:
				return _format(tr("Stick 1"))
			JOY_AXIS_RIGHT_X, JOY_AXIS_RIGHT_Y:
				return _format(tr("Stick 2"))
				
	if input is GUIDEInputJoyButton:
		return _format(tr("Joy %s") % [input.button])
		
		
	if input is GUIDEInputAction:
		return _format(tr("Action %s") % ["?" if input.action == null else input.action._editor_name()])

	if input is GUIDEInputAny:
		var parts:Array[String] = []
		if input.joy:
			parts.append(tr("Joy Button"))
		if input.mouse:
			parts.append(tr("Mouse Button"))
		if input.keyboard:
			parts.append(tr("Key"))
			
		return _format(tr("Any %s") % [ "/".join(parts) ] )
			
	if input is GUIDEInputMousePosition:
		return _format(tr("Mouse Position"))
		
	if input is GUIDEInputTouchPosition:
		return _format(tr("Touch Position %s") % [input.finger_index  if input.finger_index >= 0 else "Average"])

	if input is GUIDEInputTouchAngle:
		return _format(tr("Touch Angle"))
		
	if input is GUIDEInputTouchDistance:
		return _format(tr("Touch Distance"))

	if input is GUIDEInputTouchAxis1D:
		match input.axis:
			GUIDEInputTouchAxis1D.GUIDEInputTouchAxis.X:
				_format(tr("Touch Left/Right %s") % [input.finger_index  if input.finger_index >= 0 else "Average"])
			GUIDEInputTouchAxis1D.GUIDEInputTouchAxis.Y:
				_format(tr("Touch Up/Down %s") % [input.finger_index  if input.finger_index >= 0 else "Average"])
	
	if input is GUIDEInputTouchAxis2D:
		return _format(tr("Touch Axis 2D %s") % [input.finger_index  if input.finger_index >= 0 else "Average"])

	return _format("??")
