#ifndef JOURNALSERVICE_H
#define JOURNALSERVICE_H

#include "utils.h"
#include "HttpClient.h"
#include "logs_r.h"

#include <QObject>
#include <QString>
#include <QJsonObject>
#include <QJsonArray>
#include <QList>
#include <QStringList>
#include <QJsonDocument>

class JournalService : public QObject
{
    Q_OBJECT

public:
    explicit JournalService(HttpClient* client, QObject *parent = nullptr)
        : QObject(parent), httpClient(client) {}

    int getLogsAmount(const QMap<QString, QString>& groupWithSensors, qint64 start,  qint64 end) {
        QJsonObject rootObj;
        rootObj["start_time"] = start;
        rootObj["end_time"] = end;
        QJsonObject sensorsObj;
        for (auto it = groupWithSensors.constBegin(); it != groupWithSensors.constEnd(); ++it) {
            QJsonArray sensorArray;
            sensorArray.append(it.value());
            sensorsObj[it.key()] = sensorArray;
        }
        rootObj["sensors"] = sensorsObj;
        QJsonDocument doc(rootObj);
        QByteArray requestData = doc.toJson();

        QJsonObject responseJson = httpClient->post(utils::API_URL + "/logs/getLogsAmount", QJsonDocument::fromJson(requestData).object());


        if (responseJson.contains("amount")) {
            return responseJson["amount"].toInt();
        }
        return 0;
    }

    QList<LogsR> tmpB(int pageNum, int pageSize, qint64 start = 1734063255,  qint64 end = 1735392656) {
        QJsonObject rootObj;
        rootObj["start_time"] = start;
        rootObj["end_time"] = end;
        rootObj["page_number"] = pageNum;
        rootObj["page_size"] = pageSize;
        QJsonDocument doc(rootObj);
        QByteArray requestData = doc.toJson();


        QJsonObject responseJson = httpClient->post(utils::API_URL + "/logs/getLogs", QJsonDocument::fromJson(requestData).object());

        QList<LogsR> logList;

        if (responseJson.contains("logs") && responseJson["logs"].isArray()) {
            QJsonArray alarmsArray = responseJson["logs"].toArray();

            for (const QJsonValue& value : alarmsArray) {
                if (value.isObject()) {
                    LogsR log;
                    log.parseResponse(value.toObject());
                    logList.append(log);
                }
            }
        }

        return logList;
    }

    int tmpA(qint64 start = 1734063255,  qint64 end = 1735392656) {
        QJsonObject rootObj;
        rootObj["start_time"] = start;
        rootObj["end_time"] = end;
        QJsonDocument doc(rootObj);
        QByteArray requestData = doc.toJson();


        QJsonObject responseJson = httpClient->post(utils::API_URL + "/logs/getLogsAmount", QJsonDocument::fromJson(requestData).object());

        if (responseJson.contains("amount")) {
            return responseJson["amount"].toInt();
        }
        return 0;
    }

    QStringList getLogs(const QMap<QString, QString>& groupWithSensors, const QList<int>& threatLevels, qint64 start,  qint64 end, int pageNum, int pageSize) {
        QJsonObject rootObj;
        QJsonArray threatLevelsArray;
        for (int level : threatLevels) {
            threatLevelsArray.append(level);
        }
        rootObj["threat_levels"] = threatLevelsArray;
        rootObj["start_time"] = start;
        rootObj["end_time"] = end;
        rootObj["page_number"] = pageNum;
        rootObj["page_size"] = pageSize;
        QJsonObject sensorsObj;
        for (auto it = groupWithSensors.constBegin(); it != groupWithSensors.constEnd(); ++it) {
            QJsonArray sensorArray;
            sensorArray.append(it.value());
            sensorsObj[it.key()] = sensorArray;
        }
        rootObj["sensors"] = sensorsObj;
        QJsonDocument doc(rootObj);
        QByteArray requestData = doc.toJson();


        QJsonObject responseJson = httpClient->post(utils::API_URL + "/logs/getLogs", QJsonDocument::fromJson(requestData).object());

        QStringList logsList;

        if (responseJson.contains("logs") && responseJson["logs"].isArray()) {
            QJsonArray logsArray = responseJson["logs"].toArray();

            for (const QJsonValue& logValue : logsArray) {
                if (logValue.isObject()) {
                    LogsR log;
                    log.parseResponse(logValue.toObject());
                    logsList.append(log.getMark() + " - " + log.getMessage());
                }
            }
        }

        return logsList;
    }

private:
    HttpClient* httpClient;
};

#endif // JOURNALSERVICE_H