#pragma once

#include <xcb/xcb_image.h>

#include "Window.h"
#include "XcbWindow.h"
#include "Image.h"

class XcbImage
{
public:
    XcbImage(xcb_connection_t* connection, mt::Window* window, xcb_screen_t* screen)
    {
        mPixmap = xcb_generate_id(connection);
        auto hwnd = dynamic_cast<XcbWindow*>(window->getPlatformWindow())->getHandle();
        const auto w = window->getWidth();
        const auto h = window->getHeight();
        xcb_create_pixmap(connection, screen->root_depth, mPixmap, hwnd, w, h);
    }

    void update(mt::Window* window, xcb_screen_t* screen, xcb_connection_t* connection, xcb_gcontext_t gc)
    {
        if (!mXImage)
        {
            auto backing_image = window->getImage();

            const auto w = window->getWidth();
            const auto h = window->getHeight();

            //auto data = const_cast<unsigned char*>(backing_image->getDataPtr());
            auto data = backing_image->getData();
            unsigned char* converted = &data[0];
            mXImage = xcb_image_create_native(connection, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP, screen->root_depth, converted, w*h*4, converted);

            xcb_image_put(connection, mPixmap, gc, mXImage, 0, 0, 0);
            //xcb_image_destroy(mXImage);
        }
    }

    xcb_pixmap_t getPixMap() const
    {
        return mPixmap;
    }

private:
    xcb_pixmap_t mPixmap{0};
    xcb_image_t* mXImage{nullptr};
};
