/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#pragma once

#include <string>
#include <vector>

#if defined(CMAKE_BUILD_WITH_CMAKE)
#include "cm_uv.h"
#endif

class cmServer;
class cmFileMonitor;
class LoopGuard;

class cmServerConnection
{
public:
  cmServerConnection();
  virtual ~cmServerConnection();

  void SetServer(cmServer* s);

  bool ProcessEvents(std::string* errorMessage);

  void ReadData(const std::string& data);
  void TriggerShutdown();
  void WriteData(const std::string& data);
  void ProcessNextRequest();

  virtual void Connect(uv_stream_t* server) { (void)(server); }

  cmFileMonitor* FileMonitor() const { return this->mFileMonitor; }

protected:
  virtual bool DoSetup(std::string* errorMessage) = 0;
  virtual void TearDown() = 0;

  void SendGreetings();

  uv_loop_t* Loop() const { return mLoop; }

protected:
  std::string RawReadBuffer;
  std::string RequestBuffer;

  uv_stream_t* ReadStream = nullptr;
  uv_stream_t* WriteStream = nullptr;

private:
  uv_loop_t* mLoop = nullptr;
  cmFileMonitor* mFileMonitor = nullptr;
  cmServer* Server = nullptr;
  uv_signal_t* SIGINTHandler = nullptr;
  uv_signal_t* SIGHUPHandler = nullptr;

  friend class LoopGuard;
};

class cmServerStdIoConnection : public cmServerConnection
{
public:
  cmServerStdIoConnection();
  bool DoSetup(std::string* errorMessage) override;

  void TearDown() override;

private:
  typedef union
  {
    uv_tty_t* tty;
    uv_pipe_t* pipe;
  } InOutUnion;

  bool usesTty = false;

  InOutUnion Input;
  InOutUnion Output;
};

class cmServerPipeConnection : public cmServerConnection
{
public:
  cmServerPipeConnection(const std::string& name);
  bool DoSetup(std::string* errorMessage) override;

  void TearDown() override;

  void Connect(uv_stream_t* server) override;

private:
  const std::string PipeName;
  uv_pipe_t* ServerPipe = nullptr;
  uv_pipe_t* ClientPipe = nullptr;
};
