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

#include "libvideostitch/config.hpp"

#include "batchwindow.hpp"

#include "libvideostitch-gui/mainwindow/signalhandler.hpp"
#include "libvideostitch-gui/mainwindow/uniqueqapplication.hpp"
#include "libvideostitch-gui/mainwindow/vslocalserver.hpp"

#include "libvideostitch-base/file.hpp"
#include "libvideostitch-base/logmanager.hpp"
#include "libgpudiscovery/delayLoad.hpp"

#include <memory>

#ifdef Q_OS_WIN
#define PLATFORM_SUFFIX "-win"
#elif defined(Q_OS_LINUX)
#define PLATFORM_SUFFIX "-linux"
#elif defined(Q_OS_MAC)
#define PLATFORM_SUFFIX "-mac"
#endif

static const QString STYLE_VARIABLES_FILE(":/assets/qss/style_variables.ini");
static const QString COMMON_STYLE_VARIABLES_FILE(":/style/common_style_variables.ini");

#ifdef DELAY_LOAD_ENABLED
SET_DELAY_LOAD_HOOK
#endif  // DELAY_LOAD_ENABLED

int main(int argc, char *argv[]) {
  // First, set organization and application names
  UniqueQApplication::initializeOrganization();
  QCoreApplication::setApplicationName(VIDEOSTITCH_BATCH_STITCHER_APP_NAME);

  // select best framework backend
  if (!VideoStitch::BackendLibHelper::selectBackend(VideoStitch::BackendLibHelper::getBestFrameworkAndBackend())) {
    std::cerr << "Unable to load "
              << VideoStitch::Discovery::getFrameworkName(VideoStitch::Discovery::getBestFramework()) << " backend."
              << std::endl;
    return 1;
  }

  UniqueQApplication app(argc, argv, VSBATCHKEY);
  SignalHandler::setupHandlers();

  app.setUpLogger();

  if (!app.uniqueInstance()) {
    if (argc == 1) {
      app.connectAndSend(Packet(Packet::WAKEUP), VSBATCHKEY);
    } else {
      QStringList arguments = app.arguments();
      arguments.pop_front();
      QString args;
      for (int i = 0; i < arguments.size(); i++) {
        args += arguments[i];
      }
      app.connectAndSend(Packet(Packet::OPEN_FILES, args.size(), args.toLocal8Bit()), VSBATCHKEY);
    }
  }
  app.loadStylesheetFile(":/style/vs_common.qss", STYLE_VARIABLES_FILE, COMMON_STYLE_VARIABLES_FILE);
  app.loadStylesheetFile(":/resources/batchstitcher.qss", STYLE_VARIABLES_FILE, COMMON_STYLE_VARIABLES_FILE);
  /*app.loadStylesheetFile(QString(":/assets/qss/vs_darkgray%0.qss").arg(PLATFORM_SUFFIX), STYLE_VARIABLES_FILE,
   * COMMON_STYLE_VARIABLES_FILE);*/
  QString fileToOpen;
  if (argc >= 1) {
    fileToOpen = app.arguments().value(1);
  }

  BatchWindow w(fileToOpen);
  if (app.uniqueInstance()) {
    w.show();
  }
  QObject::connect(&app, SIGNAL(messageAvailable(Packet)), &w, SLOT(processMessage(Packet)));
  return app.exec();
}