#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 <QSystemTrayIcon>

#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"
#include "docsupdater.h"

#include "waitanimationwidget.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 DocsUpdater;

class SERVERLMS_EXPORT ServerLMSWidget : public QWidget
{
    Q_OBJECT

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

    void start();

public:
    static const QString languageENG;
    static const QString languageRUS;

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

    void resizeEvent(QResizeEvent *event) override;

signals:
    //сигнал смены языка
    void signal_LanguageChanged(QString language);

    //сигнал вывода сообщения из трея
    void signal_Tray_ShowMessage(QString textMsg, QSystemTrayIcon::MessageIcon iconMsg = QSystemTrayIcon::Information);

    void signal_Menu_ShowWindow();
    void signal_Menu_HideWindow();

    void sigRecognize();
    void sigCalculateFullHash();
    void sigUpdateControllerInitialize(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager);
    QTcpSocket* sigGetSocket();

    void signal_DocsChanged();

public slots:
    void slot_LanguageChanged(QString language);
    void slot_UpdateListClients();
    void slot_BlockAutorization(bool block);
    void slot_AddMessageToLog(QString message);

    void slot_ErrorPostgreSQL(QString text);

    void slot_UpdateDocs();

    void slot_startInitialization_step1();

    void slot_setVersion(QString versionStr);

public:
    QString getLanguage()
    {
        return language;
    }

    void setError(int code)
    {
        errorCode = code;
    }

    int hasError() const
    {
        return errorCode;
    }

    ProcessingSystem* getProcessingSystem()
    {
        return processingSystem;
    }

    QMutex *getMutex() const
    {
        return mutex;
    }

    void removeClient(int socketId);

private slots:
    void on_btnStartServer_clicked();
    void on_btnStopServer_clicked();
    void on_btnSettings_clicked();
    void slot_trySetServerState(PacketType packetType);

private:
    void setLanguageInterfase();
    void updateMyStyleSheet();
    QString loadStyleSheet();

    void startInitialization_step0();

    void tryConnectionToDB();

    void updateStateServer();

private:
    Ui::ServerLMSWidget *ui;

private:
    WaitAnimationWidget *waitAnimationWidget;

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

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

    DocsUpdater* docsUpdater;
    ProviderDBLMS* providerDBLMS;

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

    QTranslator qtLanguageTranslator;
    QString language;
    int errorCode;

    bool flStartInitialization;
};

#endif // SERVERLMSWIDGET_H
