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

#pragma once

#include "libvideostitch/algorithm.hpp"
#include "libvideostitch/parse.hpp"

#include <memory>

namespace VideoStitch {
namespace MergerMask {

/**
 * @brief Configuration used by the MergerMaskAlgorithm
 */
class MergerMaskConfig {
 public:
  explicit MergerMaskConfig(const Ptv::Value* config);
  ~MergerMaskConfig() = default;

  MergerMaskConfig(const MergerMaskConfig&);

  bool isValid() const { return isConfigValid; }

  /* @return The max overlapping width of two inputs in the output space*/
  int getMaxOverlappingWidth() const { return maxOverlappingWidth; }

  /* @return The maximum size of the panoramic image used for optimization */
  size_t getSizeThreshold() const { return sizeThreshold; }

  /* @return The maximum distortion value that a pixel in the output panorama can have (higher value indicates a more
   * distorted pixel) */
  unsigned char getDistortionThreshold() const { return distortionThreshold; }

  /* @return List of frames used for the optimization */
  std::vector<unsigned int> getFrames() const { return frames; }

  /* @return Size of the kernel used for min-pooling in the image difference metric */
  int getKernelSize() const { return kernelSize; }

  /* @return A parameter used to transform the distortion value*/
  float getDistortionParam() const { return distortionParam; }

  /* @return Whether to use/not use the blending order */
  bool useBlendingOrder() const { return blendingOrder; }

  /* @return Whether to use/not use the seam*/
  bool useSeam() const { return seam; }

  /* @return The feathering size along seam*/
  int getSeamFeatheringSize() const { return seamFeatheringSize; }

  int getInputScaleFactor() const { return inputScaleFactor; }

 private:
  bool isConfigValid;
  int maxOverlappingWidth;
  bool blendingOrder;
  bool seam;
  size_t sizeThreshold;
  unsigned char distortionThreshold;
  float distortionParam;
  int kernelSize;
  int seamFeatheringSize;
  int inputScaleFactor;
  std::vector<unsigned int> frames;
};

}  // namespace MergerMask
}  // namespace VideoStitch