#ifndef XCB_WINDOW_SENSE_API_H
#define XCB_WINDOW_SENSE_API_H

#include <string>
#include <vector>
#include <memory>
#include <user/senseApiDesc.h>
#include <user/deviceAttachmentSpec.h>
#include <xcbXorg/xcbXorg.h>

namespace xcb_window {

/**
 * @brief Window selector for X11 windows
 */
struct WindowSelector
{
    xcb_xorg::window_search::MatchType matchType;
    int display;
    int screen;
    uint32_t windowId;
    std::string windowName;

    std::string stringify() const;
};

/**
 * @brief Represents an attached X11 window device
 */
class AttachedWindow
{
public:
    AttachedWindow(
        const std::shared_ptr<smo::device::DeviceAttachmentSpec>& spec);
    ~AttachedWindow();

    const std::shared_ptr<smo::device::DeviceAttachmentSpec>&
    getDeviceAttachmentSpec() const
        { return deviceAttachmentSpec; }
    const WindowSelector& getWindowSelector() const { return windowSelector; }
    const std::string& getActualWindowName() const { return actualWindowName; }
    void* getXcbConnection() const { return xcbConnectionShared.get(); }
    std::string stringify() const;

private:
    void parseWindowSelector(const smo::device::DeviceAttachmentSpec& spec);

    std::shared_ptr<smo::device::DeviceAttachmentSpec> deviceAttachmentSpec;
    WindowSelector windowSelector;
    std::string actualWindowName;
    std::shared_ptr<xcb_xorg::XcbConnection> xcbConnectionShared;
};

} // namespace xcb_window

#endif // XCB_WINDOW_SENSE_API_H
