#pragma once

#include <X11/Xlib.h>

#include <string>
#include <vector>

#include "screen.hh"

namespace uw {
  typedef unsigned char uchar;
  typedef unsigned long ulong;

  typedef struct Extent3D {
    int width;
    int height;
    int depth;
  } Extent3D;

  class Image {
    public:
      Image(Screen &screen, const std::string imgPath);
      ~Image();

      Visual *getVisual() { return v; }
      XImage *getImage() { return image; }
      GC getGC() { return gc; }
      Pixmap getPixmap() { return pm; }
      Extent3D getExtent() { return imageExtent; }
      uchar *getImageData() { return data; }
      std::string getImagePath() { return imagePath; }

    private:
      void createDepth();
      void createPixmap();
      void createImage();
      void createGC();

      Visual *v;
      XImage *image;
      GC gc;
      Pixmap pm;

      uchar *data = nullptr;
      std::vector<uchar> cdata;
      Extent3D imageExtent;
      int chan;
      int width;
      int height;
      int depth;
      std::string imagePath;

      Screen &uwScreen;
  };
}