#include "dataparser.h"

#include <QFile>

DataParser::DataParser(ProcessingSystem *processingSystem,QObject *parent) :
QObject(parent)
{
    this->processingSystem = processingSystem;
    mutex = new QMutex;

    if (!QDir(staticDataFolderName).exists()){
        QDir().mkdir(staticDataFolderName);
    }
    qDebug() << "ParserThread: " << QThread::currentThreadId();
}

void DataParser::xmlParser(ClientHandler *client, QByteArray array)
{
    QXmlStreamReader xmlReader(array);

    xmlReader.readNext();   // Переходим к первому элементу в файле

    //Крутимся в цикле до тех пор, пока не достигнем конца документа
    while(!xmlReader.atEnd())
    {
        //Проверяем, является ли элемент началом тега
        if(xmlReader.isStartElement())
        {
            //Анализируем теги
            if(xmlReader.name() == "ClientAutorization")
            {//Запрос авторизации от клиента

                ClientAutorization clientAutorization;

                /*Перебираем все атрибуты тега*/
                foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
                {
                    QString name = attr.name().toString();
                    QString value = attr.value().toString();
                    //addTextToLogger(name + ": " + value);

                    if(name == "Login")
                        clientAutorization.Login = value;
                    else if(name == "Password")
                        clientAutorization.Password = value;
                    else if(name == "NumberOfScreen")
                        clientAutorization.NumberOfScreen = value.toInt();
                }

                processingSystem->processingClientAutorization(client, clientAutorization);
            }
            else if(xmlReader.name() == "ClientMessage")
            {//Сообщение от клиента

                ClientMessage clientMessage;

                /*Перебираем все атрибуты тега*/
                foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
                {
                    QString name = attr.name().toString();
                    QString value = attr.value().toString();
                    //addTextToLogger(name + ": " + value);

                    if(name == "Text")
                        clientMessage.Text = value;
                }

                processingSystem->processingClientMessage(client, clientMessage);
            }
            else if(xmlReader.name() == "ClientNotify")
            {//Уведомление от клиента

                ClientNotify clientNotify;

                /*Перебираем все атрибуты тега*/
                foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
                {
                    QString name = attr.name().toString();
                    QString value = attr.value().toString();

                    if(name == "Code")
                        clientNotify.Code = value;
                }

                processingSystem->processingClientNotify(client, clientNotify);
            }
            else if(xmlReader.name() == "DataInfo")
            {
                dataInfo = new DataInfo;

                foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
                {
                    QString name = attr.name().toString();
                    QString value = attr.value().toString();

                    if(name == "path")
                        dataInfo->path= value.toUtf8();

                    if(name == "size")
                        dataInfo->size = value.toLong();
                }

            }
            else
            {
                emit sigLogMessage("XmlParser: unrecognized tag");
            }

        }
        xmlReader.readNext(); // Переходим к следующему элементу файла
    }//while(!xmlReader.atEnd())
}

void DataParser::xmlFileDataParse(QByteArray array)
{
    QXmlStreamReader xmlReader(array);
    datas = new QList<FileData>;
    xmlReader.readNext();   // Переходим к первому элементу в файле

    //Крутимся в цикле до тех пор, пока не достигнем конца документа
    while(!xmlReader.atEnd())
    {
        //Проверяем, является ли элемент началом тега
        if(xmlReader.isStartElement())
        {
            if(xmlReader.name() == "FileData")
            {
                FileData data;

                foreach(const QXmlStreamAttribute &attr,xmlReader.attributes())
                {
                    QString name = attr.name().toString();
                    QString value = attr.value().toString();

                    if(name == "Path")
                        data.path = value;
                    else if(name == "Hash")
                        data.hash = value;
                }

                datas->append(data);
            }
        }

        xmlReader.readNext();
    }
}


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;

        /* Открываем файл для Чтения*/
        QFile fileR(tempFile);
        if (!fileR.open(QFile::ReadOnly | QFile::Text))
        {
            QString str = "Не удалось открыть файл";
            qDebug() << "xmlAnswer: " << str;
        }
        else
        {
            array = fileR.readAll();
            fileR.close();   // Закрываем файл
        }
        mutex->unlock();

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

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


}

QByteArray DataParser::xmlAnswer_authorization(bool result, QString instructorName,QString clientName, QString accessType)
{

    QList<SXmlAnswerTag> listTag;

    SAttribute attribute1 = {"Result", result? "true" : "false"};
    SAttribute attribute2 = {"InstructorName", instructorName};
    SAttribute attribute3 = {"ClientName", clientName};
    SAttribute attribute4 = {"AccessType", accessType};
    QList<SAttribute> listAttr = {attribute1, attribute2, attribute3, attribute4};
    SXmlAnswerTag tag = {"ServerAuthorization", listAttr};

    listTag.append(tag);

    return xmlAnswer(listTag);
}

QByteArray DataParser::xmlAnswer_message(QString text)
{
    QList<SXmlAnswerTag> listTag;

    SAttribute attribute1 = {"Text", text};
    QList<SAttribute> listAttr = {attribute1};
    SXmlAnswerTag tag = {"ServerMessage", listAttr};

    listTag.append(tag);

    return xmlAnswer(listTag);
}

QByteArray DataParser::xmlAnswer_task(QString text)
{
    QList<SXmlAnswerTag> listTag;

    SAttribute attribute1 = {"Text", text};
    QList<SAttribute> listAttr = {attribute1};
    SXmlAnswerTag tag = {"ServerTask", listAttr};

    listTag.append(tag);

    return xmlAnswer(listTag);
}

QByteArray DataParser::xmlAnswer_notify(QString code)
{
    QList<SXmlAnswerTag> listTag;

    SAttribute attribute1 = {"Code", code};
    QList<SAttribute> listAttr = {attribute1};
    SXmlAnswerTag tag = {"ServerNotify", listAttr};

    listTag.append(tag);

    return xmlAnswer(listTag);
}

QByteArray DataParser::xmlAnswer_tasks(QStringList listTasks)
{
    QList<SXmlAnswerTag> listTag;

    foreach(QString task, listTasks)
    {
        QList<SAttribute> listAttr;

        SAttribute attribute1 = {"Head", task};
        SAttribute attribute2 = {"IsComplete", "false"};
        listAttr.append(attribute1);
        listAttr.append(attribute2);

        SXmlAnswerTag tag = {"ServerTask", listAttr};
        listTag.append(tag);
    }

    return xmlAnswer(listTag, "TaskArray", "Tasks");
}

DataInfo *DataParser::getCurrentDataInfo()
{
    return dataInfo;
}

void DataParser::clearCurrentDataInfo()
{
    delete dataInfo;
}

QList<FileData> *DataParser::getDatas() const
{
    return datas;
}

DataParser::~DataParser()
{

}
