#ifndef CLIENTHANDLER_H
#define CLIENTHANDLER_H

#include <QObject>
#include <Systems/sendsystem.h>
#include "Client.h"
#include <QTcpSocket>
#include <QThread>

class SendSystem;
class DataParser;
class Logger;
class ServerLMSWidget;
class UpdateController;
class RecognizeSystem;

class ClientHandler : public QObject
{
    Q_OBJECT

public:
    ClientHandler(QObject* parent = nullptr);
    void initSender(DataParser *dataParser,Logger *logger);
    void sendXmlAnswer(QByteArray array);
    void sendFolderBlock(QString path);
    void sendFileBlock(QString path);
    bool getIsSendStopped();
    void sendDeleteBlock(QString path);
    void sendFinish();
    void sendMessageBlock(QString text);
    void sendNeedUpdate(bool flag, quint64 size,quint64 fileCount);
    void sendDisable();
    void recognize();
    void sendHash();

    ~ClientHandler();

    Client *getClient() const;
    SendSystem *getSendSystem() const;

    QTcpSocket *getSocket() const;

signals:
    void sigSendXmlAnswer(QByteArray array);
    void sigInitSender (DataParser *dataParse,Logger *logger);
    void sigFolderBlock(QString path);
    void sigFileBlock(QString path);
    bool sigGetIsSendStopped();
    void sigSendDeleteBlock(QString path);
    void sigSendFinish();
    void sigSendMessageBlock(QString text);
    void sigNeedUpdate(bool flag,quint64 size,quint64 fileCount);
    void sigClientDisconnected(QString address,QString port);
    void sigSendHash();
    void sigRecognize(ClientHandler *handler);
    void sigSendNotify(QString notify);
    void sigSendFileBlockWithRename (QString path,QString newName);
    void sigSocketWrite(QByteArray array);
    void sigSocketClose();
    bool sigSocketFlush();

public :
    QThread *thread;
    QTcpSocket *socket;

    void initialize(int descriptor, ServerLMSWidget *serverWidget,
    UpdateController *updateController, DataParser *dataParser,Logger *logger);
private:
    UpdateController *updateController;
    RecognizeSystem *recognizeSystem;
    Client *client;

    SendSystem *sendSystem;
    ServerLMSWidget *server;
};

#endif // CLIENTHANDLER_H
