#include "dataparseroutput.h"

DataParserOutput::DataParserOutput(QObject *parent) :
    QObject(parent),
    authPassCache(nullptr){}

QByteArray DataParserOutput::xmlAnswer_notify(const QString& code)
{
    QList<SXmlAnswerTag> listTag;

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

    listTag.append(tag);

    return xmlAnswer(listTag);
}

QByteArray DataParserOutput::xmlAnswer(const QList<SXmlAnswerTag>& listTag, const QString& elemUp1, const QString& elemUp2)
{
    /* Открываем файл для Записи*/
    QFile file(tempName);
    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(tempName);
    if (!fileR.open(QFile::ReadOnly | QFile::Text))
    {
        QString str = "Не удалось открыть файл";
        qDebug() << "xmlAnswer: " << str;
    }
    else
    {
        array = fileR.readAll();
        fileR.close();   // Закрываем файл
    }

    return array;
}

void DataParserOutput::createFileDataList(const QList<FileData>& fileDataList,const QString& filename)
{
    QFile file(filename);
    file.open(QIODevice::WriteOnly);
    QXmlStreamWriter xmlWriter(&file);

    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("FileDataList");

    foreach (FileData data,fileDataList)
    {
        xmlWriter.writeStartElement("FileData");

        xmlWriter.writeAttribute("Path",data.path);
        xmlWriter.writeAttribute("Hash",data.hash);

        xmlWriter.writeEndElement();
    }

    xmlWriter.writeEndElement();
    xmlWriter.writeEndDocument();

    file.close();
}

void DataParserOutput::createAuthMessage(ClientAutorization *auth)
{
    authPassCache = auth; //кэширование даных авторизации, для сохранения при успешном заходе

    QFile file(tempName);
    file.open(QIODevice::WriteOnly);
    QXmlStreamWriter xmlWriter(&file);

    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("ClientAutorization");

    xmlWriter.writeAttribute("Login",auth->Login);
    xmlWriter.writeAttribute("Password",auth->Password);

    xmlWriter.writeEndElement();
    xmlWriter.writeEndElement();
    xmlWriter.writeEndDocument();

    file.close();
}

void DataParserOutput::createServerSettings(ServerSettings* serverSettings)
{
    QFile file(settingsName);
    file.open(QIODevice::WriteOnly);

    QXmlStreamWriter xmlWriter(&file);

    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();

    xmlWriter.writeStartElement("ServerSettingsContainer");
    xmlWriter.writeStartElement("ServerSettings");

    xmlWriter.writeAttribute("Address",serverSettings->Address);
    xmlWriter.writeAttribute("Port",serverSettings->Port);
    xmlWriter.writeAttribute("Language","RUS");
    xmlWriter.writeAttribute("AutoStart",QString::number(false));
    xmlWriter.writeAttribute("DestPortMath","18003");
    xmlWriter.writeAttribute("LocalPortMath","18004");
    xmlWriter.writeAttribute("UseMathModel",QString::number(serverSettings->mathModelUse));

    xmlWriter.writeEndElement();

    if(serverSettings->LocalVersionName == "")
    {
        xmlWriter.writeStartElement("VersionData");
        xmlWriter.writeAttribute("Version","-----");
        xmlWriter.writeAttribute("isChangable","0");
        xmlWriter.writeEndElement();
    }
    else
    {
        xmlWriter.writeStartElement("VersionData");
        xmlWriter.writeAttribute("Version",serverSettings->LocalVersionName);
        xmlWriter.writeAttribute("isChangable",QString::number(serverSettings->versionData.getIsChangeable()));
    }

    xmlWriter.writeEndElement();

    xmlWriter.writeEndDocument();

    file.close();

}

void DataParserOutput::changeVersion(StreamingVersionData *versionData)
{
    QFile file(settingsName);

    file.open(QIODevice::ReadWrite);
    QByteArray xmlData(file.readAll());

    QDomDocument doc;
    doc.setContent(xmlData);
    QDomElement containerElement = doc.firstChildElement("ServerSettingsContainer");
    QDomElement verDataElement = containerElement.firstChildElement("VersionData");
    verDataElement.setAttribute("Version",versionData->getViewName());
    verDataElement.setAttribute("Created",versionData->getCreateData().toString());
    verDataElement.setAttribute("isChangable",versionData->getIsChangeable());

    file.resize(0);
    QTextStream out(&file);
    doc.save(out,4);

    file.close();

}

void DataParserOutput::createAuthData(ServerAuthorization *serverAuth)
{
    QFile file(authTempName);
    file.open(QIODevice::WriteOnly);

    QXmlStreamWriter xmlWriter(&file);

    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("AuthData");
    xmlWriter.writeAttribute("Login",authPassCache->Login);
    xmlWriter.writeAttribute("Password",authPassCache->Password);
    xmlWriter.writeAttribute("InstructorName",serverAuth->InstructorName);
    xmlWriter.writeAttribute("ClientName",serverAuth->ClientName);
    xmlWriter.writeAttribute("AccessType",serverAuth->AccessType);

    xmlWriter.writeEndElement();
    file.close();

}

void DataParserOutput::createAuthDataOffline(const QString& username,const QString& pass)
{
    QFile file(authTempName);
    file.open(QIODevice::WriteOnly);

    QXmlStreamWriter xmlWriter(&file);

    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("AuthData");
    xmlWriter.writeAttribute("Login",username);
    xmlWriter.writeAttribute("Password",pass);
    xmlWriter.writeAttribute("InstructorName","empty");
    xmlWriter.writeAttribute("ClientName","Offline");
    xmlWriter.writeAttribute("AccessType","Offline");

    xmlWriter.writeEndElement();
    file.close();
}

void DataParserOutput::addRunData(QList<int> displays)
{
    QFile file(displayTemp);
    file.open(QIODevice::WriteOnly);
    QString data;

    for(int i = 0; i < displays.count(); i++)
    {
        data.append(QString::number(displays[i]) + ";");
    }

    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartElement("DisplayInfo");
    xmlWriter.writeAttribute("DisplaysID",data);
    xmlWriter.writeEndElement();
    file.close();

}

void DataParserOutput::saveClientSettings(const QString& language, bool isAutoStart)
{
    QFile file(settingsName);
    file.open(QIODevice::ReadOnly | QIODevice::Text);

    QString settings = file.readAll();

    file.close();
    file.remove();

    file.open(QIODevice::WriteOnly | QIODevice::Text);

    auto languagePos = settings.indexOf(XMLLanguageProperty) + XMLLanguageProperty.length();
    settings = settings.replace(languagePos,language.size(),language);

    auto autoStartPos = settings.indexOf(XMLAutoStartProperty) + XMLAutoStartProperty.length();
    settings = settings.replace(autoStartPos,1,QString::number(isAutoStart));

    file.write(settings.toUtf8());
    file.close();
}

QList<FileData>* DataParserOutput::xmlFileDataParse(const QByteArray& array,const QString& filter)
{
    QXmlStreamReader xmlReader(array);
    QList<FileData> *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;
                }

                if(data.path.contains(filter))

                datas->append(data);
            }
        }

        xmlReader.readNext();
    }

    return datas;
}
