#include "sendsystem.h"
#include "tools.h"

#include <QFile>
#include <QFileInfo>
#include <QThread>



SendSystem::SendSystem(QObject *)
{

}

void SendSystem::setSocket(QTcpSocket *socket)
{
    this->socket = socket;
}


void SendSystem::sendDisable()
{
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);

    QByteArray data;
    data = emit sigGetXmlAnswer("DISABLE");

    stream << PacketType::TYPE_XMLANSWER;
    stream << data;
    socket->waitForBytesWritten();
}

//void SendSystem::sendXMLmsgGUItoServer(QByteArray array)
//{
//    qDebug() << "SendSystem" << QThread::currentThreadId();
//    QDataStream stream(socket);
//    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);

//    stream << PacketType::TYPE_XMLANSWER;
//    stream << array;
//    socket->waitForBytesWritten(6000);
//}

void SendSystem::sendFileBlock(QString path)
{
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
    QString fullPath = Tools::createFullPath(path);
    quint64 fileSize = 0;
    int countSend = 0;


    QFile file(fullPath);       //Открываем файл для чтения
    QFileInfo fileInfo(file);

    fileSize = fileInfo.size();

    stream << PacketType::TYPE_FILE; //Отправляем тип блока
    stream << path << fileSize;

    socket->waitForReadyRead(20);
    //socket->waitForBytesWritten();

    if(file.open(QFile::ReadOnly)){
        while(!file.atEnd()){
            QByteArray data = file.read(1025*250);
            stream << data;
            socket->waitForBytesWritten();
            countSend++;
        }

        qDebug() << Tools::getTime() << "count end Final: " << countSend;
    }

    file.close();

    emit sigSend();
    //qDebug() << "Transaction after send file: " << socket->isTransactionStarted();
    countSend = 0;
    //socket->waitForBytesWritten();
    socket->waitForReadyRead(20);
}

void SendSystem::sendFolderBlock(QString path)
{
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);

    stream << PacketType::TYPE_FOLDER;
    stream << path;
    emit sigSend();
    socket->waitForReadyRead(100);
}


void SendSystem::sendQTConnect()
{
    QByteArray container;
    int numPackage = (int)PacketType::TYPE_QT;
    container.append(numPackage & 0x000000ff);
    container.append((numPackage >> 8) & 0x000000ff);
    container.append((numPackage >> 16) & 0x000000ff);
    container.append((numPackage >> 24) & 0x000000ff);

    socket->write(container);
    socket->waitForBytesWritten();
}

void SendSystem::sendXMLAnswer(QByteArray array)
{
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);

    stream << PacketType::TYPE_XMLANSWER;
    stream << array;

    socket->waitForBytesWritten();
    socket->waitForReadyRead(100);
}

void SendSystem::sendFinish()
{
    socket->waitForReadyRead(100);
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);

    stream << PacketType::TYPE_FINISH;
    socket->waitForReadyRead(100);
}

void SendSystem::sendChangeVersion(StreamingVersionData *streamingVersion)
{
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
    stream << PacketType::CHANGE_DATA_VERSION;
    stream << streamingVersion->getViewName();

    socket->waitForReadyRead(100);
}

void SendSystem::sendDeleteVersion(StreamingVersionData *streamingVersion)
{
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
    stream << PacketType::DELETE_DATA_VERSION;
    stream << streamingVersion->getViewName();

    socket->waitForReadyRead(100);
}

void SendSystem::sendCopyVersion(QString versionName)
{
    QDataStream stream(socket);
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
    stream << PacketType::COPY_VERSION;

    stream << versionName;
}

void SendSystem::sendPacketType(PacketType packetType)
{
    QDataStream stream(socket);
    QByteArray data;
    stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);

    stream << packetType;
}
SendSystem::~SendSystem()
{

}
