#include "dataparser.h"

#include <QFile>
#include <QDomDocument>

DataParser::DataParser(AssetsManager *assetManager,ProcessingSystem *processingSystem,QObject *parent) :
QObject(parent)
{
    this->processingSystem = processingSystem;
    this->assetsManager = assetManager;

    clientAnswer = new ClientAnswerParser;
    clientAnswer->initialize(this);

    dbAnswer = new DBAnswerParser;
    dbAnswer->initialize(this);

    processParser = new ProcessParser;
    processParser->initialize(processingSystem);

    mutex = new QMutex;

    qDebug() << "ParserThread: " << QThread::currentThreadId();
}



QByteArray DataParser::xmlAnswer(QList<SXmlAnswerTag> listTag, QString elemUp1, QString elemUp2)
{
    try {

        mutex->lock();
        /* Открываем файл для Записи*/
        QFile file(tempFile);
        file.open(QIODevice::WriteOnly);

        /* Создаем объект, с помощью которого осуществляется запись в файл */
        QXmlStreamWriter xmlWriter(&file);

        xmlWriter.setAutoFormatting(true);  // Устанавливаем автоформатирование текста

        xmlWriter.writeStartDocument();     // Запускаем запись в документ

        if(elemUp1 != "")
            xmlWriter.writeStartElement(elemUp1);   // Записываем тег

        if(elemUp2 != "")
            xmlWriter.writeStartElement(elemUp2);   // Записываем тег

        //Записываем все элементы
        foreach(SXmlAnswerTag tag, listTag)
        {
            xmlWriter.writeStartElement(tag.elementName);   // Записываем тег

            // Записываем атрибуты
            foreach(SAttribute attr, tag.attr)
                xmlWriter.writeAttribute(attr.name, attr.value);

            xmlWriter.writeEndElement();        // Закрываем тег
        }

        if(elemUp1 != "")
            xmlWriter.writeEndElement();        // Закрываем тег

        if(elemUp1 != "")
            xmlWriter.writeEndElement();        // Закрываем тег

        /* Завершаем запись в документ*/
        xmlWriter.writeEndDocument();

        file.close();   // Закрываем файл

        QByteArray array;

        array = readTempFile();
        mutex->unlock();

        return array;
    }
    catch(const std::exception& e)

    {
        qDebug() << e.what();
        return nullptr;
    }


}

bool DataParser::loadBlankXML(QString nameFile, QDomDocument *commonDOM)
{
    QFile blankFile(nameFile);

    if (! blankFile.open(QFile::ReadOnly | QFile::Text)) {
        qDebug() << "loadBlankXML: Couldn't read the file: " + nameFile;
        return false;
    }

    commonDOM->setContent(blankFile.readAll());
    blankFile.close();

    return true;
}

bool DataParser::saveDOMtoXML(QString nameFile, QDomDocument *commonDOM)
{
    QFile xmlOutFile(nameFile);
    if (!xmlOutFile.open(QFile::WriteOnly | QFile::Text))
    {
        qDebug() << "saveDOMtoXML: Failed to write a file: " + nameFile;
        return false;
    }
    else
    {
        QTextStream outFile(&xmlOutFile);
        commonDOM->save(outFile, 4);
        xmlOutFile.close();
    }
    return true;
}

QByteArray DataParser::readTempFile()
{
    QByteArray array;
    QFile fileR(tempFile);
    if (!fileR.open(QFile::ReadOnly | QFile::Text))
    {
        QString str = "Не удалось открыть файл";
        qDebug() << "xmlAnswer: " << str;
    }
    else
    {
        array = fileR.readAll();
        fileR.close();
    }

    return array;
}

ClientAnswerParser *DataParser::ClientAnswer() const
{
    return clientAnswer;
}

DBAnswerParser *DataParser::DbAnswer() const
{
    return dbAnswer;
}

ProcessParser *DataParser::getProcessParser() const
{
    return processParser;
}

DataParser::~DataParser()
{

}


