#include "DapChainWalletHandler.h"
#include <QDebug>

DapChainWalletHandler::DapChainWalletHandler(QObject *parent) : QObject(parent)
{

}

QString DapChainWalletHandler::parse(const QByteArray &aWalletAddress)
{
    qDebug() << aWalletAddress;
    QStringList result = QString::fromLatin1(aWalletAddress).split(" ");
    return result.at(result.size()-1).trimmed();
}

QStringList DapChainWalletHandler::createWallet(const QString &asNameWallet)
{
    QByteArray result;
    QProcess process;
    process.start(QString("%1 wallet new -w %2").arg(CLI_PATH).arg(asNameWallet));
    process.waitForFinished(-1);
    result = process.readAll();
    QStringList list;
    list.append(asNameWallet);
    list.append(parse(result));
    return result.isEmpty() ? QStringList() : list;
}

void DapChainWalletHandler::removeWallet(const QString &asNameWallet)
{
    QByteArray result;
    QProcess process;
    process.start(QString("rm %1%2.dwallet").arg("/opt/cellframe-node/var/lib/wallet/").arg(asNameWallet));
    qDebug() << (QString("rm %1%2.dwallet").arg("/opt/cellframe-node/var/lib/wallet/").arg(asNameWallet));
    process.waitForFinished(-1);
    result = process.readAll();
}

QMap<QString, QVariant> DapChainWalletHandler::getWallets()
{
    QMap<QString, QVariant> map;
    QProcess process;
    process.start(QString("%1 wallet list").arg(CLI_PATH));
    process.waitForFinished(-1);
    QString str = QString::fromLatin1(process.readAll());
    QRegExp rx(":{1,1}([\\s\\w\\W]+)(\\n|\\r){1,1}" );
    rx.setMinimal(true);
    int pos = 0;
    int x {0};
    QString tempName;
    while ((pos = rx.indexIn(str, pos)) != -1)
    {
        if(x == 0)
        {
            tempName = rx.cap(1);
            ++x;
        }
        else
        {
            map.insert(tempName, rx.cap(1));
            x = 0;
        }
        pos += rx.matchedLength();
    }

    return map;
}

QStringList DapChainWalletHandler::getWalletInfo(const QString &asNameWallet)
{
    QProcess process;
    process.start(QString("%1 wallet info -w %2 -net private").arg(CLI_PATH).arg(asNameWallet));
    process.waitForFinished(-1);
    QByteArray result = process.readAll();
    QRegExp rx("wallet: (\\w+)\\s+addr:\\s+(\\w+)\\s+(balance)|(\\d+.\\d+)\\s(\\(\\d+\\))\\s(\\w+)");
    QStringList list;

    int pos = 0;
    while((pos = rx.indexIn(result, pos)) != -1)
    {
        if(rx.cap(1).isEmpty())
            list << rx.cap(4) << rx.cap(5) << rx.cap(6);
        else
            list << rx.cap(1) << rx.cap(2) << rx.cap(3);

        pos += rx.matchedLength();
    }

    return list;
}

QString DapChainWalletHandler::sendToken(const QString &asSendWallet, const QString &asAddressReceiver, const QString &asToken, const QString &aAmount)
{
    QString answer;
    qInfo() << QString("sendTokenTest(%1, %2, %3, %4)").arg(asSendWallet).arg(asAddressReceiver).arg(asToken).arg(aAmount);
    QProcess processCreate;
    processCreate.start(QString("%1 tx_create -net " + m_CurrentNetwork +" -chain gdb -from_wallet %2 -to_addr %3 -token %4 -value %5")
                  .arg(CLI_PATH)
                  .arg(asSendWallet)
                  .arg(asAddressReceiver)
                  .arg(asToken)
                  .arg(aAmount));
    processCreate.waitForFinished(-1);
    QString resultCreate = QString::fromLatin1(processCreate.readAll());
    qDebug() << resultCreate;
    if(!(resultCreate.isEmpty() || resultCreate.isNull()))
    {
        QProcess processMempool;
        processMempool.start(QString("%1 mempool_proc -net " + m_CurrentNetwork +" -chain gdb").arg(CLI_PATH));
        processMempool.waitForFinished(-1);
        answer = QString::fromLatin1(processMempool.readAll());
        qDebug() << answer;
    }
    return answer;
}

void DapChainWalletHandler::setCurrentNetwork(const QString& aNetwork)
{
    if(m_CurrentNetwork != aNetwork) return;
    m_CurrentNetwork = aNetwork;
}