#ifndef OPENXR_SWAPCHAIN_HPP
#define OPENXR_SWAPCHAIN_HPP

#include "openxrmanager.hpp"
#include "openxrtexture.hpp"

struct XrSwapchainSubImage;

namespace MWVR
{
    class OpenXRSwapchainImpl;

    extern int swapCount;

    class OpenXRSwapchain
    {
    public:
        struct Config
        {
            int width = -1;
            int height = -1;
            int samples = -1;
        };

    public:
        OpenXRSwapchain(osg::ref_ptr<OpenXRManager> XR, osg::ref_ptr<osg::State> state, Config config);
        ~OpenXRSwapchain();

    public:
        //! Prepare for render (set FBO)
        void beginFrame(osg::GraphicsContext* gc);
        //! Finalize render
        int endFrame(osg::GraphicsContext* gc);
        //! Get the view surface
        const XrSwapchainSubImage& subImage(void) const;
        //! Width of the view surface
        int width();
        //! Height of the view surface
        int height();
        //! Samples of the view surface
        int samples();
        //! Get the current texture
        OpenXRTextureBuffer* renderBuffer();
        //! Get the private implementation
        OpenXRSwapchainImpl& impl() { return *mPrivate; }
        //! Get the private implementation
        const OpenXRSwapchainImpl& impl() const { return *mPrivate; }

    private:
        std::unique_ptr<OpenXRSwapchainImpl> mPrivate;
    };
}

#endif