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

#pragma once

#include "textureTarget.hpp"

#include "gpu/hostBuffer.hpp"
#include "gpu/uniqueBuffer.hpp"

#include "libvideostitch/input.hpp"
#include "libvideostitch/output.hpp"
#include "libvideostitch/panoDef.hpp"

#include <vector>

namespace VideoStitch {
namespace Core {

/**
 * @brief The InputsMap class manage computation and storage of the inputs map
 * This inputs map contains for each pixel of the destination cubemap the list of inputs which are used to produce it.
 */
class InputsMapCubemap {
 public:
  static Potential<InputsMapCubemap> create(const PanoDefinition &pano);
  virtual ~InputsMapCubemap();

 public:
  Status compute(const std::map<readerid_t, Input::VideoReader *> &, const PanoDefinition &);

  GPU::Buffer<uint32_t> getMask(TextureTarget t) {
    switch (t) {
      case CUBE_MAP_POSITIVE_X:
        return xPos.borrow();
      case CUBE_MAP_NEGATIVE_X:
        return xNeg.borrow();
      case CUBE_MAP_POSITIVE_Y:
        return yPos.borrow();
      case CUBE_MAP_NEGATIVE_Y:
        return yNeg.borrow();
      case CUBE_MAP_POSITIVE_Z:
        return zPos.borrow();
      case CUBE_MAP_NEGATIVE_Z:
        return zNeg.borrow();
      default:
        assert(false);
        return xPos.borrow();
    }
  }

 private:
  explicit InputsMapCubemap(const PanoDefinition &pano);
  Status allocateBuffers();

  GPU::UniqueBuffer<uint32_t> xPos, xNeg, yPos, yNeg, zPos, zNeg;

  int64_t length;
};

}  // namespace Core
}  // namespace VideoStitch