#ifndef OPENMW_COMPONENTS_SETTINGS_CATEGORIES_INPUT_H
#define OPENMW_COMPONENTS_SETTINGS_CATEGORIES_INPUT_H

#include <components/settings/sanitizerimpl.hpp>
#include <components/settings/settingvalue.hpp>

#include <osg/Math>
#include <osg/Vec2f>
#include <osg/Vec3f>

#include <cstdint>
#include <string>
#include <string_view>

namespace Settings
{
    struct InputCategory : WithIndex
    {
        using WithIndex::WithIndex;

        SettingValue<bool> mGrabCursor{ mIndex, "Input", "grab cursor" };
        SettingValue<float> mCameraSensitivity{ mIndex, "Input", "camera sensitivity", makeMaxStrictSanitizerFloat(0) };
        SettingValue<float> mCameraYMultiplier{ mIndex, "Input", "camera y multiplier",
            makeMaxStrictSanitizerFloat(0) };
        SettingValue<bool> mInvertXAxis{ mIndex, "Input", "invert x axis" };
        SettingValue<bool> mInvertYAxis{ mIndex, "Input", "invert y axis" };
        SettingValue<bool> mEnableController{ mIndex, "Input", "enable controller" };
        SettingValue<float> mGamepadCursorSpeed{ mIndex, "Input", "gamepad cursor speed",
            makeMaxStrictSanitizerFloat(0) };
        SettingValue<float> mJoystickDeadZone{ mIndex, "Input", "joystick dead zone",
            makeClampSanitizerFloat(0, 0.5f) };
        SettingValue<bool> mEnableGyroscope{ mIndex, "Input", "enable gyroscope" };
        SettingValue<GyroscopeAxis> mGyroHorizontalAxis{ mIndex, "Input", "gyro horizontal axis" };
        SettingValue<GyroscopeAxis> mGyroVerticalAxis{ mIndex, "Input", "gyro vertical axis" };
        SettingValue<float> mGyroInputThreshold{ mIndex, "Input", "gyro input threshold", makeMaxSanitizerFloat(0) };
        SettingValue<float> mGyroHorizontalSensitivity{ mIndex, "Input", "gyro horizontal sensitivity",
            makeMaxStrictSanitizerFloat(0) };
        SettingValue<float> mGyroVerticalSensitivity{ mIndex, "Input", "gyro vertical sensitivity",
            makeMaxStrictSanitizerFloat(0) };
    };
}

#endif
