#pragma once

#ifndef TFARMPROXY_H
#define TFARMPROXY_H

#ifdef TFARMAPI
#undef TFARMAPI
#endif

#include <string>
#include <vector>
using std::string;
using std::vector;

#include "texception.h"

#ifdef _WIN32
#ifdef TFARM_EXPORTS
#define TFARMAPI __declspec(dllexport)
#else
#define TFARMAPI __declspec(dllimport)
#endif
#else
#define TFARMAPI
#endif

//------------------------------------------------------------------------------

class TFARMAPI TFarmProxy {
public:
  TFarmProxy(const QString &hostName, const QString &addr, int port)
      : m_hostName(hostName), m_addr(addr), m_port(port) {}

  virtual ~TFarmProxy() {}

  QString sendToStub(const QString &data);
  static int extractArgs(const QString &s, vector<QString> &argv);

protected:
  QString m_hostName;
  QString m_addr;
  int m_port;
};

//------------------------------------------------------------------------------

class TFARMAPI TFarmProxyException : public TException {
public:
  TFarmProxyException(const QString &hostname, const QString &addr, int port,
                      const QString &msg)
      : TException(msg.toStdString())
      , m_hostName(hostname)
      , m_address(addr)
      , m_port(port) {}

  QString getHostName() const { return m_hostName; }

  QString getAddress() const { return m_address; }

  int getPort() const { return m_port; }

protected:
  QString m_hostName;
  QString m_address;
  int m_port;
};

//------------------------------------------------------------------------------

class CantConnectToStub final : public TFarmProxyException {
public:
  CantConnectToStub(const QString &hostname, const QString &addr, int port)
      : TFarmProxyException(hostname, addr, port, "") {}

  TString getMessage() const override;
};

#endif
