#ifndef OverbyteIcsServiceCmdH
#define OverbyteIcsServiceCmdH

#include <System.Classes.hpp>
#include <System.SysUtils.hpp>

#include "OverbyteIcsWSocket.hpp"
#include "OverbyteIcsWSocketS.hpp"
#include "OverbyteIcsTypes.hpp"

#include <memory>

class TTcpSrvClient : public TWSocketClient
{
public:
    String RcvdLine;
    String Param[11];
    int ParamCount = 0;
    TDateTime ConnectTime;
    __fastcall virtual TTcpSrvClient(TComponent *AOwner) : TWSocketClient(AOwner) {}
};

typedef void __fastcall (__closure *TDisplayProc)(const String &Msg);

class TTcpDaemon
{
public:
    TTcpDaemon();
    virtual ~TTcpDaemon();
    void Start();
    void Stop();
    String GetBanner() const;
    void SetBanner(const String &Value);

    TDisplayProc OnDisplay = nullptr;
    String Port;
    String Addr;

private:
    std::unique_ptr<TWSocketServer> FServer;

    void Display(const String &Msg);
    void ProcessData(TTcpSrvClient *Client);
    void __fastcall WSocketServer1BgException(TObject *Sender, Exception *E, bool &CanClose);
    void __fastcall WSocketServer1ClientConnect(TObject *Sender, TWSocketClient *Client, System::Word Error);
    void __fastcall WSocketServer1ClientDisconnect(TObject *Sender, TWSocketClient *Client, System::Word Error);
    void __fastcall WSocketServer1DebugDisplay(TObject *Sender, const String Msg);
    void __fastcall ClientDataAvailable(TObject *Sender, System::Word Error);
    void __fastcall ClientBgException(TObject *Sender, Exception *E, bool &CanClose);
};

#endif
