#pragma once

#ifndef TTCPIP_H
#define TTCPIP_H

#include <memory>

#include "tcommon.h"

#include <QString>
#include <QThread>

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

#ifdef TFARMAPI
#undef TFARMAPI
#endif

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

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

class TTcpIpServerImp;

class TFARMAPI TTcpIpServer : public QThread {
  int m_exitCode;

public:
  TTcpIpServer(int port);
  virtual ~TTcpIpServer();

  int getPort() const;

  void run();
  int shutdown();

  virtual void onReceive(int socket, const QString &data) = 0;

  void sendReply(int socket, const QString &reply);

  int getExitCode() const;

private:
  std::shared_ptr<TTcpIpServerImp> m_imp;
};

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

enum {
  OK,
  STARTUP_FAILED,
  HOST_UNKNOWN,
  SOCKET_CREATION_FAILED,
  CONNECTION_FAILED,
  CONNECTION_REFUSED,
  CONNECTION_TIMEDOUT,
  SEND_FAILED,
  RECEIVE_FAILED
};

class TFARMAPI TTcpIpClient {
public:
  TTcpIpClient();
  ~TTcpIpClient();

  int connect(const QString &name, const QString &addr, int port, int &sock);
  int disconnect(int sock);

  int send(int sock, const QString &data);
  int send(int sock, const QString &data, QString &reply);
};

#endif
