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

#include "gpu/testing.hpp"
#include "libvideostitch/panoDef.hpp"
#include "libvideostitch/parse.hpp"

namespace VideoStitch {
namespace Testing {

std::unique_ptr<Core::PanoDefinition> getPanoDef(std::string filename) {
  Potential<Ptv::Parser> parser = Ptv::Parser::create();
  std::cout << "Parsing" << std::endl;
  if (!parser->parse(filename)) {
    std::cerr << parser->getErrorMessage() << std::endl;
    ENSURE(false);
    return nullptr;
  }

  Core::PanoDefinition *panoDef = Core::PanoDefinition::create(parser->getRoot());
  ENSURE(panoDef);
  return std::unique_ptr<Core::PanoDefinition>(panoDef);
}

void calibrationWithTranslationTest() {
  auto panoDef = getPanoDef("data/AQ1610012338_pano.ptv");

  ENSURE_EQ(panoDef->numVideoInputs(), 4);
  ENSURE(panoDef->hasTranslations());
  ENSURE_APPROX_EQ(panoDef->computeMinimumRigSphereRadius(), 0.037255, 0.000001);
}

void noTranslationTest() {
  auto panoDef = getPanoDef("data/calibrated_full.ptv");

  ENSURE_EQ(panoDef->numVideoInputs(), 6);
  ENSURE(panoDef->hasBeenCalibrated());

  ENSURE(!panoDef->hasTranslations());
  ENSURE_EQ(panoDef->computeMinimumRigSphereRadius(), 0.);
}

}  // namespace Testing
}  // namespace VideoStitch

int main() {
  VideoStitch::Testing::initTest();
  VideoStitch::Testing::calibrationWithTranslationTest();
  VideoStitch::Testing::noTranslationTest();
  return 0;
}