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

#include "export.hpp"

#include "libgpudiscovery/delayLoad.hpp"

#include "libvideostitch/plugin.hpp"
#include "libvideostitch/ptv.hpp"
#include "libvideostitch/logging.hpp"

#include "ntv2plugin.hpp"
#include "ntv2Discovery.hpp"
#include "ntv2Reader.hpp"
#include "ntv2Writer.hpp"

#ifdef DELAY_LOAD_ENABLED
SET_DELAY_LOAD_HOOK
#endif  // DELAY_LOAD_ENABLED

extern "C" VS_PLUGINS_EXPORT VideoStitch::Potential<VideoStitch::Input::Reader>* __cdecl createReaderFn(
    const VideoStitch::Ptv::Value* config, VideoStitch::Plugin::VSReaderPlugin::Config runtime) {
  VideoStitch::Input::NTV2Reader* ntv2Reader =
      VideoStitch::Input::NTV2Reader::create(runtime.id, config, runtime.width, runtime.height);
  if (ntv2Reader) {
    return new VideoStitch::Potential<VideoStitch::Input::Reader>(ntv2Reader);
  }
  return new VideoStitch::Potential<VideoStitch::Input::Reader>(
      VideoStitch::Origin::Input, VideoStitch::ErrType::InvalidConfiguration, "Could not create Aja reader");
}

extern "C" VS_PLUGINS_EXPORT bool __cdecl handleReaderFn(const VideoStitch::Ptv::Value* config) {
  return config && config->has("type") && config->has("type")->asString() == "aja";
}

/** \name Services for writer plugin. */
//\{
extern "C" VS_PLUGINS_EXPORT VideoStitch::Potential<VideoStitch::Output::Output>* createWriterFn(
    VideoStitch::Ptv::Value const* config, VideoStitch::Plugin::VSWriterPlugin::Config run_time) {
  VideoStitch::Output::Output* lReturn = nullptr;
  VideoStitch::Output::BaseConfig baseConfig;
  if (baseConfig.parse(*config).ok()) {
    lReturn = VideoStitch::Output::NTV2Writer::create(*config, run_time.name, baseConfig.baseName, run_time.width,
                                                      run_time.height, run_time.framerate);
  }
  if (lReturn) {
    return new VideoStitch::Potential<VideoStitch::Output::Output>(lReturn);
  }
  return new VideoStitch::Potential<VideoStitch::Output::Output>(
      VideoStitch::Origin::Output, VideoStitch::ErrType::InvalidConfiguration, "Could not create Aja writer");
}

extern "C" VS_PLUGINS_EXPORT bool handleWriterFn(VideoStitch::Ptv::Value const* config) {
  bool lReturn(false);
  VideoStitch::Output::BaseConfig baseConfig;
  if (baseConfig.parse(*config).ok()) {
    lReturn = (!strcmp(baseConfig.strFmt, "aja"));
  } else {
    // TODOLATERSTATUS propagate config problem
    VideoStitch::Logger::get(VideoStitch::Logger::Verbose) << "Invalid aja config encountered" << std::endl;
  }
  return lReturn;
}

extern "C" VS_PLUGINS_EXPORT VideoStitch::Plugin::VSDiscoveryPlugin* discoverFn() {
  return VideoStitch::Plugin::Ntv2Discovery::create();
}