using UnityEngine.InputSystem.Utilities;

namespace UnityEngine.InputSystem
{
    /// <summary>
    /// A collection of common usage string values as reported by <see cref="InputControl.usages"/>.
    /// </summary>
    public static class CommonUsages
    {
        /// <summary>
        /// Primary 2D motion control.
        /// </summary>
        /// <remarks>
        /// Example: Left stick on a gamepad.
        /// </remarks>
        public static readonly InternedString Primary2DMotion = new InternedString("Primary2DMotion");

        /// <summary>
        /// Secondary 2D motion control.
        /// </summary>
        /// <remarks>
        /// Example: Right stick on a gamepad.
        /// </remarks>
        public static readonly InternedString Secondary2DMotion = new InternedString("Secondary2DMotion");

        /// <summary>
        /// The primary action control on any input device, such as a gamepad, mouse, or keyboard.
        /// </summary>
        /// <remarks>
        /// Example: Primary mouse button (left button on right-handed configuration, right button on left-handed configuration),
        /// south-button on a gamepad.
        /// </remarks>
        public static readonly InternedString PrimaryAction = new InternedString("PrimaryAction");

        /// <summary>
        /// Secondary action control on any input device, such as a gamepad, mouse, or keyboard.
        /// </summary>
        /// <remarks>
        /// Example: Secondary mouse button (right button on right-handed configuration, left button on left-handed configuration),
        /// east-button on a gamepad.
        /// </remarks>
        public static readonly InternedString SecondaryAction = new InternedString("SecondaryAction");

        /// <summary>
        /// The primary trigger control on input devices with triggers.
        /// </summary>
        /// <remarks>
        /// Example: Right trigger-button on a gamepad.
        /// </remarks>
        public static readonly InternedString PrimaryTrigger = new InternedString("PrimaryTrigger");

        /// <summary>
        /// The secondary trigger control on input devices with triggers.
        /// </summary>
        /// <remarks>
        /// Example: Left trigger-button on a gamepad.
        /// </remarks>
        public static readonly InternedString SecondaryTrigger = new InternedString("SecondaryTrigger");

        /// <summary>
        /// A modifier action control that modifies usage of other controls.
        /// </summary>
        /// <remarks>
        /// Example: Keyboard modifier keys like CTRL, SHIFT, ALT, OPTION, etc.
        /// </remarks>
        public static readonly InternedString Modifier = new InternedString("Modifier");

        /// <summary>
        /// The spatial position control on input devices with spatial tracking.
        /// </summary>
        /// <remarks>
        /// Example: User head position in tracking-space using e.g. a head-tracking system. This could for example be a VR tracking system or another user-facing tracking sensor.
        /// </remarks>
        public static readonly InternedString Position = new InternedString("Position");

        /// <summary>
        /// The spatial orientation control on input devices with spatial tracking.
        /// </summary>
        /// <remarks>
        /// Example: User head-orientation in tracking-space using e.g. a head-tracking system. This could for example be a VR tracking system or another user-facing tracking sensor.
        /// </remarks>
        public static readonly InternedString Orientation = new InternedString("Orientation");

        /// <summary>
        /// The primary hat-switch control on input devices with hat-switches such as joysticks or gamepads.
        /// </summary>
        /// <remarks>
        /// Example: Joystick or gamepad hat-switch.
        /// </remarks>
        public static readonly InternedString Hatswitch = new InternedString("Hatswitch");

        /// <summary>
        /// Button to navigate to previous location.
        /// </summary>
        /// <remarks>
        /// Example: Escape on keyboard, B button on gamepad.
        ///
        /// In general, the "Back" control is used for moving backwards in the navigation history
        /// of a UI. This is used, for example, in hierarchical menu structures to move back to parent menus
        /// (e.g. from the "Settings" menu back to the "Main" menu). Consoles generally have stringent requirements
        /// as to which button has to fulfill this role.
        /// </remarks>
        public static readonly InternedString Back = new InternedString("Back");

        /// <summary>
        /// Button to navigate to next location.
        /// </summary>
        public static readonly InternedString Forward = new InternedString("Forward");

        /// <summary>
        /// Button to bring up menu.
        /// </summary>
        public static readonly InternedString Menu = new InternedString("Menu");

        /// <summary>
        /// Button to confirm the current choice.
        /// </summary>
        public static readonly InternedString Submit = new InternedString("Submit");

        ////REVIEW: isn't this the same as "Back"?
        /// <summary>
        /// Button to not accept the current choice.
        /// </summary>
        public static readonly InternedString Cancel = new InternedString("Cancel");

        /// <summary>
        /// Horizontal motion axis.
        /// </summary>
        /// <remarks>
        /// Example: X axis on mouse.
        /// </remarks>
        public static readonly InternedString Horizontal = new InternedString("Horizontal");

        /// <summary>
        /// Vertical motion axis.
        /// </summary>
        /// <remarks>
        /// Example: Y axis on mouse.
        /// </remarks>
        public static readonly InternedString Vertical = new InternedString("Vertical");

        /// <summary>
        /// Rotation around single, fixed axis.
        /// </summary>
        /// <remarks>
        /// Example: twist on joystick or twist of pen (few pens support that).
        /// </remarks>
        public static readonly InternedString Twist = new InternedString("Twist");

        /// <summary>
        /// Pressure level axis.
        /// </summary>
        /// <remarks>
        /// Example: pen pressure.
        /// </remarks>
        public static readonly InternedString Pressure = new InternedString("Pressure");

        /// <summary>
        /// Axis to scroll horizontally.
        /// </summary>
        public static readonly InternedString ScrollHorizontal = new InternedString("ScrollHorizontal");

        /// <summary>
        /// Axis to scroll vertically.
        /// </summary>
        public static readonly InternedString ScrollVertical = new InternedString("ScrollVertical");

        /// <summary>
        /// A screen-space point.
        /// </summary>
        /// <remarks>
        /// Example: Touch contact point.
        /// </remarks>
        public static readonly InternedString Point = new InternedString("Point");

        /// <summary>
        /// Low-frequency haptic motor for force-feedback.
        /// </summary>
        public static readonly InternedString LowFreqMotor = new InternedString("LowFreqMotor");

        /// <summary>
        /// High-frequency haptic motor for force-feedback.
        /// </summary>
        public static readonly InternedString HighFreqMotor = new InternedString("HighFreqMotor");

        /// <summary>
        /// Device in left hand.
        /// </summary>
        /// <remarks>
        /// Example: left hand XR controller.
        /// </remarks>
        public static readonly InternedString LeftHand = new InternedString("LeftHand");

        /// <summary>
        /// Device in right hand.
        /// </summary>
        /// <remarks>
        /// Example: right hand XR controller.
        /// </remarks>
        public static readonly InternedString RightHand = new InternedString("RightHand");

        /// <summary>
        /// Axis representing charge of battery (1=full, 0=empty).
        /// </summary>
        public static readonly InternedString BatteryStrength = new InternedString("BatteryStrength");
    }
}