#ifndef OPENMW_COMPONENTS_SETTINGS_CATEGORIES_STEREOVIEW_H
#define OPENMW_COMPONENTS_SETTINGS_CATEGORIES_STEREOVIEW_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 StereoViewCategory : WithIndex
    {
        using WithIndex::WithIndex;

        SettingValue<int> mEyeResolutionX{ mIndex, "Stereo View", "eye resolution x", makeMaxSanitizerInt(1) };
        SettingValue<int> mEyeResolutionY{ mIndex, "Stereo View", "eye resolution y", makeMaxSanitizerInt(1) };
        SettingValue<double> mLeftEyeOffsetX{ mIndex, "Stereo View", "left eye offset x" };
        SettingValue<double> mLeftEyeOffsetY{ mIndex, "Stereo View", "left eye offset y" };
        SettingValue<double> mLeftEyeOffsetZ{ mIndex, "Stereo View", "left eye offset z" };
        SettingValue<double> mLeftEyeOrientationX{ mIndex, "Stereo View", "left eye orientation x",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<double> mLeftEyeOrientationY{ mIndex, "Stereo View", "left eye orientation y",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<double> mLeftEyeOrientationZ{ mIndex, "Stereo View", "left eye orientation z",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<double> mLeftEyeOrientationW{ mIndex, "Stereo View", "left eye orientation w",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<float> mLeftEyeFovLeft{ mIndex, "Stereo View", "left eye fov left",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
        SettingValue<float> mLeftEyeFovRight{ mIndex, "Stereo View", "left eye fov right",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
        SettingValue<float> mLeftEyeFovUp{ mIndex, "Stereo View", "left eye fov up",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
        SettingValue<float> mLeftEyeFovDown{ mIndex, "Stereo View", "left eye fov down",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
        SettingValue<double> mRightEyeOffsetX{ mIndex, "Stereo View", "right eye offset x" };
        SettingValue<double> mRightEyeOffsetY{ mIndex, "Stereo View", "right eye offset y" };
        SettingValue<double> mRightEyeOffsetZ{ mIndex, "Stereo View", "right eye offset z" };
        SettingValue<double> mRightEyeOrientationX{ mIndex, "Stereo View", "right eye orientation x",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<double> mRightEyeOrientationY{ mIndex, "Stereo View", "right eye orientation y",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<double> mRightEyeOrientationZ{ mIndex, "Stereo View", "right eye orientation z",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<double> mRightEyeOrientationW{ mIndex, "Stereo View", "right eye orientation w",
            makeClampSanitizerDouble(-1, 1) };
        SettingValue<float> mRightEyeFovLeft{ mIndex, "Stereo View", "right eye fov left",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
        SettingValue<float> mRightEyeFovRight{ mIndex, "Stereo View", "right eye fov right",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
        SettingValue<float> mRightEyeFovUp{ mIndex, "Stereo View", "right eye fov up",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
        SettingValue<float> mRightEyeFovDown{ mIndex, "Stereo View", "right eye fov down",
            makeClampSanitizerFloat(-osg::PIf, osg::PIf) };
    };
}

#endif
