#include "DapChainHistoryHandler.h"

DapChainHistoryHandler::DapChainHistoryHandler(QObject *parent) :
    QObject(parent)
{
    m_timoutRequestHistory = new QTimer(this);
    QObject::connect(m_timoutRequestHistory, &QTimer::timeout, this, &DapChainHistoryHandler::requsetWallets, Qt::QueuedConnection);
    m_timoutRequestHistory->start(3000);
}

QVariant DapChainHistoryHandler::getHistory() const
{
    return m_history;
}

void DapChainHistoryHandler::onRequestNewHistory(const QMap<QString, QVariant>& aWallets)
{
    QList<QVariant> wallets = aWallets.values();
    if(wallets.isEmpty()) return;

    QList<QVariant> data;
    for(int i = 0; i < wallets.count(); i++)
    {
        QProcess process;
        process.start(QString("%1 tx_history -net %2 -chain gdb -addr %3").arg(CLI_PATH).arg(m_CurrentNetwork).arg(wallets.at(i).toString()));
        process.waitForFinished(-1);

        QByteArray result = process.readAll();

        if(!result.isEmpty())
        {
            QRegularExpression regular("((\\w{3}\\s+){2}\\d{1,2}\\s+(\\d{1,2}:*){3}\\s+\\d{4})\\s+(\\w+)\\s+(\\d+)\\s(\\w+)\\s+\\w+\\s+([\\w\\d]+)", QRegularExpression::MultilineOption);
            QRegularExpressionMatchIterator matchItr = regular.globalMatch(result);
            while (matchItr.hasNext())
            {
                QRegularExpressionMatch match = matchItr.next();
                QStringList dataItem = QStringList()
                                       << match.captured(1)
                                       << QString::number(DapTransactionStatusConvertor::getStatusByShort(match.captured(4)))
                                       << match.captured(5)
                                       << match.captured(6)
                                       << match.captured(7)
                                       << wallets.at(i).toString();
                data << dataItem;

            }
        }
    }


    if(m_history != data)
    {
        m_history = data;
        emit changeHistory(m_history);
    }
}

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