#include "updatecontroller.h"

UpdateController::UpdateController(DataParser *parser, QObject *parent) :
    QObject(parent)
{
    this->dataParser = parser;
    localPath = QDir::currentPath() + "/Application";
}


void UpdateController::CalculateHash()
{
    qDebug() << "Try calculate";


    QDirIterator iterator(localPath,QDirIterator::Subdirectories);
    fileDataList.clear();
    QList<FileData> *files = new QList<FileData>;
    QList<FileData> * folders = new QList<FileData>;

    if(!QDir("Application").exists()){  //проверка на наличие папки
        QDir().mkdir("Application");
    }

    QDir dir(localPath);
    QString hashString;

    while (iterator.hasNext())
    {
        iterator.next();
        QFileInfo fileInfo = iterator.fileInfo();
        FileData currentFile;
        QFile file(fileInfo.absoluteFilePath());

        quint64 fileSize = file.size();     //буффер для хэширования крупных файлов
        const quint64 bufferSize = 10240;

        if(fileInfo.isHidden()) continue;

        if(fileInfo.isFile() && file.open(QIODevice::ReadOnly))
        {
            char buffer[bufferSize];
            int bytesRead;
            int readSize = qMin(fileSize,bufferSize);

            QCryptographicHash hash(QCryptographicHash::Md5);

            while(readSize > 0 && (bytesRead = file.read(buffer,readSize)) > 0){
                fileSize -= bytesRead;
                hash.addData(buffer,bytesRead);
                readSize = qMin(fileSize,bufferSize);
            }
            hashString = QString(hash.result().toHex());
            currentFile.path = Tools::CreateLocalPath(fileInfo.absoluteFilePath());
            currentFile.hash = hashString;
            files->push_back(currentFile);
        }
        else if (fileInfo.isDir() && !fileInfo.isRoot() && fileInfo.fileName() != "..")
        {
            currentFile.path = Tools::CreateLocalPath(fileInfo.path());
            currentFile.hash = "FOLDER";

            if(!folders->contains(currentFile)){
                folders->push_back(currentFile);
            }
        }

    }

    fileDataList.append(*folders);
    fileDataList.append(*files);

    dataParser->CreateXML(fileDataList);

    delete folders;
    delete files;

}



UpdateController::~UpdateController()
{

}
