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

#include "libvideostitch/algorithm.hpp"

#include "registeredAlgo.hpp"

namespace VideoStitch {
namespace Util {
Algorithm::Algorithm() {}

Algorithm::~Algorithm() {}

void Algorithm::list(std::vector<std::string>& algos) {
  algos.clear();
  typedef RegisteredAlgoBase<false>::InstanceMap AlgoMap;
  for (const AlgoMap::value_type& inst : RegisteredAlgoBase<false>::getInstances()) {
    algos.push_back(inst.first);
  }
}

const char* Algorithm::getDocString(const std::string& name) {
  RegisteredAlgoBase<false>* reg = RegisteredAlgoBase<false>::getInstance(name);
  if (reg) {
    return reg->getDocString();
  }
  return nullptr;
}

Potential<Algorithm> Algorithm::create(const std::string& name, const Ptv::Value* config) {
  RegisteredAlgoBase<false>* reg = RegisteredAlgoBase<false>::getInstance(name);
  if (reg) {
    return reg->create(config);
  }
  return {Origin::PanoramaConfiguration, ErrType::UnsupportedAction, "Unknown algorithm: '" + name + "'"};
}

OnlineAlgorithm::OnlineAlgorithm() {}

OnlineAlgorithm::~OnlineAlgorithm() {}

void OnlineAlgorithm::list(std::vector<std::string>& algos) {
  algos.clear();
  typedef RegisteredAlgoBase<true>::InstanceMap AlgoMap;
  for (const AlgoMap::value_type& inst : RegisteredAlgoBase<true>::getInstances()) {
    algos.push_back(inst.first);
  }
}

const char* OnlineAlgorithm::getDocString(const std::string& name) {
  RegisteredAlgoBase<false>* reg = RegisteredAlgoBase<false>::getInstance(name);
  if (reg) {
    return reg->getDocString();
  }
  return nullptr;
}

Potential<OnlineAlgorithm> OnlineAlgorithm::create(const std::string& name, const Ptv::Value* config) {
  RegisteredAlgoBase<true>* reg = RegisteredAlgoBase<true>::getInstance(name);
  if (reg) {
    return reg->create(config);
  }
  return {Origin::PanoramaConfiguration, ErrType::UnsupportedAction, "Unknown algorithm: '" + name + "'"};
}

}  // namespace Util
}  // namespace VideoStitch