#pragma once

#include <QObject>
#include <QUrl>
//#include <QJsonObject>

class QWebSocketServer;
class QWebSocket;

class ConfigHandler;
class SystemHandler;
class OcsHandler;
class ItemHandler;

class WebSocketServer : public QObject
{
    Q_OBJECT

public:
    explicit WebSocketServer(ConfigHandler *configHandler, const QString &serverName = "WebSocketServer", quint16 serverPort = 0, QObject *parent = 0);
    ~WebSocketServer();

signals:
    void started();
    void stopped();

public slots:
    bool start();
    void stop();
    bool isError();
    QString errorString();
    QUrl serverUrl();

private slots:
    void wsNewConnection();
    void wsDisconnected();
    void wsTextMessageReceived(const QString &message);
    void wsBinaryMessageReceived(const QByteArray &message);

    void itemMetadataSetChanged();
    void itemDownloadStarted(QJsonObject result);
    void itemDownloadFinished(QJsonObject result);
    void itemDownloadProgress(QString id, qint64 bytesReceived, qint64 bytesTotal);
    void itemInstallStarted(QJsonObject result);
    void itemInstallFinished(QJsonObject result);
    void itemUninstallStarted(QJsonObject result);
    void itemUninstallFinished(QJsonObject result);

private:
    void execRequest(const QJsonObject &request);
    void sendResponse(const QJsonObject &response);

    ConfigHandler *configHandler_;
    SystemHandler *systemHandler_;
    OcsHandler *ocsHandler_;
    ItemHandler *itemHandler_;

    QString serverName_;
    quint16 serverPort_;
    QWebSocketServer *wsServer_;
    QList<QWebSocket *> wsClients_;
};