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

#include "calibrationPresetsMakerConfig.hpp"

#include "libvideostitch/parse.hpp"

#include <memory>

namespace VideoStitch {
namespace CalibrationPresetsMaker {

CalibrationPresetsMakerConfig::CalibrationPresetsMakerConfig(const Ptv::Value* config)
    : isConfigValid(true),
      presetsName(""),
      focalStdDevValuePercentage(PTV_DEFAULT_INPUTDEF_TEMPLATE_FOCAL_STD_DEV_VALUE_PERCENTAGE),
      centerStdDevWidthPercentage(PTV_DEFAULT_INPUTDEF_TEMPLATE_CENTER_STD_DEV_WIDTH_PERCENTAGE),
      distortStdDevValuePercentage(PTV_DEFAULT_INPUTDEF_TEMPLATE_DISTORT_STD_DEV_VALUE_PERCENTAGE),
      yawStdDev(PTV_DEFAULT_INPUTDEF_TEMPLATE_ANGLE_STD_DEV),
      pitchStdDev(PTV_DEFAULT_INPUTDEF_TEMPLATE_ANGLE_STD_DEV),
      rollStdDev(PTV_DEFAULT_INPUTDEF_TEMPLATE_ANGLE_STD_DEV),
      translationXStdDev(PTV_DEFAULT_INPUTDEF_TEMPLATE_TRANSLATION_STD_DEV),
      translationYStdDev(PTV_DEFAULT_INPUTDEF_TEMPLATE_TRANSLATION_STD_DEV),
      translationZStdDev(PTV_DEFAULT_INPUTDEF_TEMPLATE_TRANSLATION_STD_DEV) {
  if (!config) {
    isConfigValid = false;
    return;
  }

  if (Parse::populateString("presets_name", *config, "name", presetsName, true) != Parse::PopulateResult::OK) {
    isConfigValid = false;
    return;
  }

  auto populateOptionalDoubleValue = [&](double& value, const std::string& name) {
    if (VideoStitch::Parse::populateDouble(name, *config, name, value, false) == Parse::PopulateResult::WrongType) {
      isConfigValid = false;
    }
  };

  populateOptionalDoubleValue(focalStdDevValuePercentage, "focal_std_dev_value_percentage");
  populateOptionalDoubleValue(centerStdDevWidthPercentage, "center_std_dev_width_percentage");
  populateOptionalDoubleValue(distortStdDevValuePercentage, "distort_std_dev_value_percentage");
  populateOptionalDoubleValue(yawStdDev, "yaw_std_dev");
  populateOptionalDoubleValue(pitchStdDev, "pitch_std_dev");
  populateOptionalDoubleValue(rollStdDev, "roll_std_dev");
  populateOptionalDoubleValue(translationXStdDev, "translation_x_std_dev");
  populateOptionalDoubleValue(translationYStdDev, "translation_y_std_dev");
  populateOptionalDoubleValue(translationZStdDev, "translation_z_std_dev");
}

CalibrationPresetsMakerConfig::CalibrationPresetsMakerConfig(const CalibrationPresetsMakerConfig& other)
    : isConfigValid(other.isConfigValid),
      presetsName(other.presetsName),
      focalStdDevValuePercentage(other.focalStdDevValuePercentage),
      centerStdDevWidthPercentage(other.centerStdDevWidthPercentage),
      distortStdDevValuePercentage(other.distortStdDevValuePercentage),
      yawStdDev(other.yawStdDev),
      pitchStdDev(other.pitchStdDev),
      rollStdDev(other.rollStdDev),
      translationXStdDev(other.translationXStdDev),
      translationYStdDev(other.translationYStdDev),
      translationZStdDev(other.translationZStdDev) {}

}  // namespace CalibrationPresetsMaker
}  // namespace VideoStitch