#include "DapChainNodeNetworkHandler.h"


DapChainNodeNetworkHandler::DapChainNodeNetworkHandler(QObject *parent) : QObject(parent)
{

}

const QString &DapChainNodeNetworkHandler::getCurrentNetwork() const
{
    return m_CurrentNetwork;
}

QVariant DapChainNodeNetworkHandler::getNodeNetwork() const
{
    QProcess process;
    process.start(QString("%1 node dump -net %2 -full").arg(CLI_PATH).arg(m_CurrentNetwork));
    process.waitForFinished(-1);

    QByteArray result = process.readAll();

    QMap<QString, QVariant> nodeMap;

    if(!result.isEmpty())
    {
        QStringList nodes = QString::fromStdString(result.toStdString()).split("node ");
        for(int m = 1; m < nodes.count(); m++)
        {
            QString node = nodes.at(m);
            QStringList nodeData;
            QRegExp rx_node("address ((?:[0-9A-F]{4}::){3}[0-9A-F]{4}).+"
                            "cell (0[xX][0-9A-F]{16}).+"
                            "ipv4 ((?:[0-9]{1,3}\\.){3}[0-9]{1,3}).+"
                            "ipv6 ::.+"
                            "alias (\\S+).+"
                            "links (\\d+).+");

            rx_node.indexIn(node, 0);
            for(int i = 2; i < 6; i++) nodeData << rx_node.cap(i);

            if(nodeData.last().toUInt() > 0)
            {
                QRegExp rx_links("link\\d+ address : ((?:[0-9A-F]{4}::){3}[0-9A-F]{4})");
                int pos = 0;
                while ((pos = rx_links.indexIn(node, pos)) != -1)
                {
                    nodeData << rx_links.cap(1);
                    pos += rx_links.matchedLength();
                }
            }

            nodeMap[rx_node.cap(1)] = nodeData;
        }
    }


    QProcess process_status;
    process_status.start(QString(CLI_PATH) + " net -net " + m_CurrentNetwork + " get status");

    process_status.waitForFinished(-1);
    QByteArray result_status = process_status.readAll();

    if(!result_status.isEmpty())
    {
        QRegExp reg_exp("Network \"([\\w\\W]+)\" has state (\\w+).+, "
                        "active links \\d+ from \\d+, cur node address ((?:[0-9A-F]{4}::){3}[0-9A-F]{4})");

        reg_exp.indexIn(result_status, 0);
        nodeMap["current"] = QStringList() << reg_exp.cap(3) << reg_exp.cap(2);
    }

    return nodeMap;
}

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

void DapChainNodeNetworkHandler::setNodeStatus(const bool aIsOnline)
{
    QProcess process;
    process.start(QString(CLI_PATH) + QString(" net -net %1 go %2").arg(m_CurrentNetwork).arg(aIsOnline ? "online" : "offline"));
    process.waitForFinished(-1);
}