#ifndef SERVERLMSWIDGET_H
#define SERVERLMSWIDGET_H

#include "ServerLMS_global.h"

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QXmlStreamWriter>
#include <QMap>
#include <QTranslator>
#include <QMutex>

#include <Systems/Parsers/dataparser.h>
#include <Systems/sendsystem.h>
#include <Systems/processingsystem.h>
#include <Systems/updatecontroller.h>
#include <Systems/assetsmanager.h>
#include <Systems/recognizesystem.h>
#include <Systems/logger.h>
#include <Systems/commonclienthandler.h>
#include <Systems/assetsmanager.h>

#include <Data/typesDataServerClient.h>
#include <Data/Client.h>
#include "multithreadserver.h"
#include "providerdblms.h"

namespace Ui {
class ServerLMSWidget;
}

class DataParser;
class SendSystem;
class ProcessingSystem;
class Logger;
class UpdateController;
class RecognizeSystem;
class ClientHandler;
class MultiThreadServer;
class AssetsManager;
class ChatSystem;

class SERVERLMS_EXPORT ServerLMSWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ServerLMSWidget(QWidget *parent = nullptr);
    ~ServerLMSWidget();

    void setError(int code);

protected:
    // Метод получения событий
    // В нём будет производиться проверка события смены перевода приложения
    void changeEvent(QEvent * event) override;

signals:
    void sigRecognize();
    void sigCalculateFullHash();
    void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager);

    QTcpSocket* sigGetSocket();

public slots:
    void slot_LanguageChanged(QString language);
    void slotUpdateListClients();
    void slot_BlockAutorization(bool block);
    void addToLog(QString message);    
public:
    void removeClient(int socketId);

    int hasError() const
    {
        return errorCode;
    }

    ProcessingSystem* getProcessingSystem()
    {
        return processingSystem;
    }

    QMutex *getMutex() const;

private slots:
    void on_btnStartServer_clicked();
    void on_btnStopServer_clicked();

private:
    Ui::ServerLMSWidget *ui;

private:
    MultiThreadServer *server;
    QThread *updateThread;
    QThread *loggerThread;
    QMutex *mutex;

    DataParser *dataParser;
    ProcessingSystem *processingSystem;
    UpdateController *updateController;
    AssetsManager *assetsManager;
    CommonClientHandler *commonClientHandler;
    ChatSystem *chatSystem;

    ProviderDBLMS* providerDBLMS;

    bool first = true; // для тестов Unity

    QTranslator qtLanguageTranslator;
    int errorCode;
};

#endif // SERVERLMSWIDGET_H
