// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#pragma once

#include "common-config.hpp"

#include "libvideostitch/config.hpp"

#include <qopengl.h>

#include <condition_variable>
#include <mutex>
#include <memory>

static GLenum cube[6] = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
                         GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
                         GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z};

class VS_COMMON_EXPORT Texture {
 public:
  enum Type { PANORAMIC, CUBEMAP, EQUIANGULAR_CUBEMAP };

  const static GLuint ID_NONE = -1;

  Texture()
      : id(ID_NONE),
        pixelBuffer(0),
        date(0),
        lock(std::make_shared<std::mutex>()),
        _type(PANORAMIC),
        _width(0),
        _height(0),
        _length(0) {
    for (int i = 0; i < 6; ++i) {
      pbo[i] = 0;
    }
  }

  static Texture& get() { return getLeft(); }

  static Texture& getLeft();
  static Texture& getRight();

  inline Texture::Type getType() const { return _type; }
  inline int getWidth() const { return _width; }
  inline int getHeight() const { return _height; }
  inline int getLength() const { return _length; }

  void setPanoramicSize(int width, int height);
  void setCubemapSize(int width, int height, int length, Type type);

  void latePanoramaDef();
  void lateCubemapDef();

  GLuint id;

  GLuint pixelBuffer;
  GLuint pbo[6];

  mtime_t date;
  std::shared_ptr<std::mutex> lock;

  Texture(Texture const&) = delete;
  void operator=(Texture const&) = delete;

 private:
  Type _type;
  int _width;
  int _height;
  int _length;
  bool _needToRedefinePano = false;
  bool _needToRedefineCubemap = false;
};