#include "globaldefine.h"
#include "devicepanel.h"
#include "deviceitem.h"
#include "gutil/qnetwork.h"
#include <QDir>
#include <QDateTime>
#include <QCoreApplication>
#include <QMessageBox>
#include <QMetaEnum>

QList<LedCard> gSelCards;
bool gVideoCompress = true;
bool gVideoTranscoding = true;
bool gTextAntialiasing = false;
bool gWidthSplit = false;
bool gHideDetect = false;
bool gShowLora = false;

DeviceItem *findItem(QString id) {
    int cnt = gDevicePanel->mDeviceTable->topLevelItemCount();
    for(int i=0; i<cnt; ++i) {
        auto item = (DeviceItem*) gDevicePanel->mDeviceTable->topLevelItem(i);
        if(item==0) continue;
        if(item->mCard.id==id) return item;
    }
    return 0;
}

QString checkReply(QNetworkReply *reply, QJsonDocument *outJson) {
    auto err = errStr(reply);
    if(! err.isEmpty()) {
        auto data = reply->readAll();
        if(! data.isEmpty()) err = err+"\n"+QCoreApplication::translate("Def","Device replied")+": "+data;
        return err;
    }
    if(outJson) {
        auto data = reply->readAll();
        QJsonParseError jsonErr;
        *outJson = QJsonDocument::fromJson(data, &jsonErr);
        if(jsonErr.error != QJsonParseError::NoError) return "Json error: "+jsonErr.errorString()+"\n"+QCoreApplication::translate("Def","Device replied")+": "+data;
    }
    return "";
}
QString checkReplyForJson(QNetworkReply *reply, QJsonDocument *outJson, QByteArray *outData) {
    auto err = errStr(reply);
    auto data = reply->readAll();
    if(outData) *outData = data;
    if(! err.isEmpty()) {
        if(! data.isEmpty()) err = err+"\n"+QCoreApplication::translate("Def","Device replied")+": "+data;
        return err;
    }
    QJsonParseError jsonErr;
    QJsonDocument json = QJsonDocument::fromJson(data, &jsonErr);
    if(jsonErr.error != QJsonParseError::NoError) return "Json error: "+jsonErr.errorString()+"\n"+QCoreApplication::translate("Def","Device replied")+": "+data;
    if(! json["success"].toBool()) return QCoreApplication::translate("Def","Fail")+". "+QCoreApplication::translate("Def","Device replied")+": "+data;
    if(outJson) outJson->swap(json);
    return "";
}
QString checkReplyForJson(QNetworkReply *reply, QString errField) {
    auto err = errStr(reply);
    auto data = reply->readAll();
    if(! err.isEmpty()) {
        if(! data.isEmpty()) err = err+"\n"+QCoreApplication::translate("Def","Device replied")+": "+data;
        return err;
    }
    QJsonParseError jsonErr;
    QJsonDocument json = QJsonDocument::fromJson(data, &jsonErr);
    if(jsonErr.error != QJsonParseError::NoError) return "Json error: "+jsonErr.errorString()+"\n"+QCoreApplication::translate("Def","Device replied")+": "+data;
    if(! json["success"].toBool()) {
        auto errStr = json[errField].toString();
        return QCoreApplication::translate("Def","Fail")+". "+QCoreApplication::translate("Def","Device replied")+": "+(errStr.isEmpty() ? data : errStr);
    }
    return "";
}

quint64 dirFileSize(const QString &path) {
    QDir dir(path);
    quint64 size = 0;
    auto infos = dir.entryInfoList(QDir::Files);
    foreach(QFileInfo fileInfo, infos) size += fileInfo.size();
    auto subDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
    foreach(QString subDir, subDirs) size += dirFileSize(path + QDir::separator() + subDir);
    return size;
}

bool copyDir(const QString &source, const QString &destination, bool override) {
    QDir directory(source);
    if(!directory.exists()) return false;
    QString srcPath = QDir::toNativeSeparators(source);
    if(!srcPath.endsWith(QDir::separator())) srcPath += QDir::separator();
    QString dstPath = QDir::toNativeSeparators(destination);
    if (!dstPath.endsWith(QDir::separator())) dstPath += QDir::separator();

    bool error = false;
    QStringList fileNames = directory.entryList(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
    for (QStringList::size_type i=0; i != fileNames.size(); ++i)
    {
        QString fileName = fileNames.at(i);
        QString srcFilePath = srcPath + fileName;
        QString dstFilePath = dstPath + fileName;
        QFileInfo fileInfo(srcFilePath);
        if (fileInfo.isFile() || fileInfo.isSymLink())
        {
            if (override)
            {
                QFile::setPermissions(dstFilePath, QFile::WriteOwner);
            }
            QFile::copy(srcFilePath, dstFilePath);
        }
        else if (fileInfo.isDir())
        {
            QDir dstDir(dstFilePath);
            dstDir.mkpath(dstFilePath);
            if (!copyDir(srcFilePath, dstFilePath, override))
            {
                error = true;
            }
        }
    }
    return !error;
}
unsigned char GetCheckCodeIn8(unsigned char * pBuffer,unsigned int uiSize) {
    unsigned int i=0;
    unsigned char ucCheckCode=0;
    for (i=0;i<uiSize;i++) ucCheckCode+=pBuffer[i];
    return (~ucCheckCode)&0x0ff;
}