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

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

#include <memory>

namespace VideoStitch {
namespace Testing {

void rigPanoTest() {
  // Parse and create the pano
  Potential<Ptv::Parser> panoParser = Ptv::Parser::create();
  std::cout << "Parsing pano" << std::endl;
  if (!panoParser->parse("data/rig_pano/pano_6_1920x1080.ptv")) {
    std::cerr << panoParser->getErrorMessage() << std::endl;
    ENSURE(false);
  }
  const Potential<Core::PanoDefinition> panoDef = Core::PanoDefinition::create(panoParser->getRoot());
  ENSURE(panoDef.status());

  // Parse and check the compatible rig
  Potential<Ptv::Parser> rigParser1 = Ptv::Parser::create();
  std::cout << "Parsing rig 1" << std::endl;
  if (!rigParser1->parse("data/rig_pano/rig_1920x1080_good.preset")) {
    std::cerr << rigParser1->getErrorMessage() << std::endl;
    ENSURE(false);
  }
  ENSURE(panoDef->isRigPresetCompatible(&rigParser1->getRoot()));

  // Parse and check the incompatible rig 1 - Incompatible size
  Potential<Ptv::Parser> rigParser2 = Ptv::Parser::create();
  std::cout << "Parsing rig 2" << std::endl;
  if (!rigParser2->parse("data/rig_pano/rig_1280x960_good.preset")) {
    std::cerr << rigParser2->getErrorMessage() << std::endl;
    ENSURE(false);
  }
  ENSURE(!panoDef->isRigPresetCompatible(&rigParser2->getRoot()));

  // Parse and check the incompatible rig 2 - Missing camera
  Potential<Ptv::Parser> rigParser3 = Ptv::Parser::create();
  std::cout << "Parsing rig 3" << std::endl;
  if (!rigParser3->parse("data/rig_pano/rig_wrong_1.preset")) {
    std::cerr << rigParser3->getErrorMessage() << std::endl;
    ENSURE(false);
  }
  ENSURE(!panoDef->isRigPresetCompatible(&rigParser3->getRoot()));

  // Parse and check the incompatible rig 3 - Missing rig camera
  Potential<Ptv::Parser> rigParser4 = Ptv::Parser::create();
  std::cout << "Parsing rig 4" << std::endl;
  if (!rigParser4->parse("data/rig_pano/rig_wrong_2.preset")) {
    std::cerr << rigParser4->getErrorMessage() << std::endl;
    ENSURE(false);
  }
  ENSURE(!panoDef->isRigPresetCompatible(&rigParser4->getRoot()));
}

}  // namespace Testing
}  // namespace VideoStitch

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